pkernel_jce 0.3 → 0.7.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 +5 -5
- data/.gitignore +3 -0
- data/Gemfile +0 -0
- data/LICENSE.txt +0 -0
- data/README.md +0 -0
- data/Rakefile +2 -0
- data/jars/bcmail-jdk15on-165.jar +0 -0
- data/jars/bcpg-jdk15on-165.jar +0 -0
- data/jars/bcpkix-jdk15on-165.jar +0 -0
- data/jars/bcprov-ext-jdk15on-165.jar +0 -0
- data/jars/bcprov-jdk15on-165.jar +0 -0
- data/jars/bctls-jdk15on-165.jar +0 -0
- data/lib/pkernel_jce.rb +16 -0
- data/lib/pkernel_jce/bc_helpers.rb +0 -0
- data/lib/pkernel_jce/certificate.rb +450 -30
- data/lib/pkernel_jce/certificate_owner.rb +0 -2
- data/lib/pkernel_jce/converter.rb +21 -0
- data/lib/pkernel_jce/crl.rb +0 -0
- data/lib/pkernel_jce/csr.rb +24 -0
- data/lib/pkernel_jce/error.rb +0 -0
- data/lib/pkernel_jce/global.rb +5 -1
- data/lib/pkernel_jce/identity.rb +557 -82
- data/lib/pkernel_jce/io_utils.rb +2 -0
- data/lib/pkernel_jce/jfile.rb +134 -0
- data/lib/pkernel_jce/jmembuf.rb +7 -0
- data/lib/pkernel_jce/keypair.rb +409 -91
- data/lib/pkernel_jce/ocsp.rb +0 -0
- data/lib/pkernel_jce/provider.rb +26 -4
- data/lib/pkernel_jce/rfc3161.rb +0 -0
- data/lib/pkernel_jce/utils.rb +0 -0
- data/lib/pkernel_jce/version.rb +1 -1
- data/pkernel_jce.gemspec +7 -4
- data/release.job +0 -0
- metadata +42 -27
- data/.ruby-version +0 -1
- data/Gemfile.lock +0 -56
- data/jars/bcmail-jdk15on-157.jar +0 -0
- data/jars/bcpg-jdk15on-157.jar +0 -0
- data/jars/bcpkix-jdk15on-157.jar +0 -0
- data/jars/bcprov-ext-jdk15on-157.jar +0 -0
- data/jars/bcprov-jdk15on-157.jar +0 -0
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 | 
            -
             | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 2 | 
            +
            SHA256:
         | 
| 3 | 
            +
              metadata.gz: 8484c9f54aaa9c46d60af73b0e9c583069d2d6bbede8861b2092599968501a49
         | 
| 4 | 
            +
              data.tar.gz: 5d7b861533448d595ff0c54510f35f1fcd851aa4cde1e32d598a5ad6b53fbdd8
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 9434b48698041cc3166e60ddcaab6e5ec9524b55c6e1419eb235eb5dd03fe5ab0c18d0222fe1ba08757d5dcfb8a741292385c9e85ce6a438637d2b9fd168d991
         | 
| 7 | 
            +
              data.tar.gz: 30edd3121a79f3af2b6b4fc0b2c3d15b8671380bd15564361ee3329ff10e626f0a808144613db114e8efcaac24283776e205528b968dfe2ea263d449344ccd69
         | 
    
        data/.gitignore
    CHANGED
    
    
    
        data/Gemfile
    CHANGED
    
    | 
            File without changes
         | 
    
        data/LICENSE.txt
    CHANGED
    
    | 
            File without changes
         | 
    
        data/README.md
    CHANGED
    
    | 
            File without changes
         | 
    
        data/Rakefile
    CHANGED
    
    
| Binary file | 
| Binary file | 
| Binary file | 
| Binary file | 
| Binary file | 
| Binary file | 
    
        data/lib/pkernel_jce.rb
    CHANGED
    
    | @@ -11,6 +11,10 @@ require_relative 'pkernel_jce/csr' | |
| 11 11 | 
             
            require_relative 'pkernel_jce/ocsp'
         | 
| 12 12 | 
             
            require_relative 'pkernel_jce/rfc3161'
         | 
| 13 13 | 
             
            require_relative 'pkernel_jce/converter'
         | 
| 14 | 
            +
            require_relative 'pkernel_jce/jfile'
         | 
| 15 | 
            +
            require_relative 'pkernel_jce/jmembuf'
         | 
| 16 | 
            +
            require_relative 'pkernel_jce/io_utils'
         | 
| 17 | 
            +
             | 
| 14 18 |  | 
| 15 19 | 
             
            module PkernelJce
         | 
| 16 20 | 
             
              #class Error < StandardError; end
         | 
| @@ -99,4 +103,16 @@ module PkernelJce | |
| 99 103 | 
             
              class Pkernel::Converter
         | 
| 100 104 | 
             
                extend PkernelJce::Converter
         | 
| 101 105 | 
             
              end
         | 
| 106 | 
            +
             | 
| 107 | 
            +
              #class Pkernel::File
         | 
| 108 | 
            +
              #  extend PkernelJce::JFile
         | 
| 109 | 
            +
              #end
         | 
| 110 | 
            +
             | 
| 111 | 
            +
              class Pkernel::MemBuf
         | 
| 112 | 
            +
                extend PkernelJce::JMemBuf
         | 
| 113 | 
            +
              end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
              class Pkernel::IoUtils
         | 
| 116 | 
            +
                extend PkernelJce::IoUtils
         | 
| 117 | 
            +
              end
         | 
| 102 118 | 
             
            end
         | 
| 
            File without changes
         | 
| @@ -1,10 +1,11 @@ | |
| 1 1 |  | 
| 2 | 
            -
            require 'pkernel'
         | 
| 2 | 
            +
            #require 'pkernel'
         | 
| 3 3 | 
             
            require_relative 'provider'
         | 
| 4 4 | 
             
            require_relative 'utils'
         | 
| 5 5 | 
             
            require_relative 'global'
         | 
| 6 6 | 
             
            require_relative 'error'
         | 
| 7 7 | 
             
            require_relative 'certificate_owner'
         | 
| 8 | 
            +
            require_relative 'converter'
         | 
| 8 9 |  | 
| 9 10 | 
             
            require 'active_support/core_ext/time'
         | 
| 10 11 |  | 
| @@ -28,6 +29,31 @@ module PkernelJce | |
| 28 29 | 
             
            			DEF_USER_IDENTITY = DIGITAL_SIGNATURE | NON_REPUDIATION | KEY_ENCIPHERMENT | KEY_AGREEMENT 
         | 
| 29 30 | 
             
            			DEF_USER_DATA_SEC = DATA_ENCIPHERMENT | ENCIPHER_ONLY | DECIPHER_ONLY
         | 
| 30 31 | 
             
            			DEF_ISSUER = DIGITAL_SIGNATURE | NON_REPUDIATION | KEY_ENCIPHERMENT | CRL_SIGN | KEY_CERT_SIGN
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  KsuMap = {
         | 
| 34 | 
            +
                    :digital_sign => DIGITAL_SIGNATURE,
         | 
| 35 | 
            +
                    :non_repudiation => NON_REPUDIATION,
         | 
| 36 | 
            +
                    :key_encipherment => KEY_ENCIPHERMENT,
         | 
| 37 | 
            +
                    :data_encipherment => DATA_ENCIPHERMENT,
         | 
| 38 | 
            +
                    :key_agreement => KEY_AGREEMENT,
         | 
| 39 | 
            +
                    :key_cert_sign => KEY_CERT_SIGN,
         | 
| 40 | 
            +
                    :crl_sign => CRL_SIGN,
         | 
| 41 | 
            +
                    :encipher_only => ENCIPHER_ONLY,
         | 
| 42 | 
            +
                    :decipher_only => DECIPHER_ONLY
         | 
| 43 | 
            +
                  }
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                  KsuKeyName = {
         | 
| 46 | 
            +
                    :digital_sign => "Digital Signature",
         | 
| 47 | 
            +
                    :non_repudiation => "Non Repudiation",
         | 
| 48 | 
            +
                    :key_encipherment => "Key Encipherment",
         | 
| 49 | 
            +
                    :data_encipherment => "Data Encipherment",
         | 
| 50 | 
            +
                    :key_agreement => "Key Agreement",
         | 
| 51 | 
            +
                    :key_cert_sign => "Key & Cert Sign",
         | 
| 52 | 
            +
                    :crl_sign => "CRL Sign",
         | 
| 53 | 
            +
                    :encipher_only => "Encipher Only",
         | 
| 54 | 
            +
                    :decipher_only => "Decipher Only"
         | 
| 55 | 
            +
                  }
         | 
| 56 | 
            +
             | 
| 31 57 | 
             
            		end
         | 
| 32 58 | 
             
                # end module CertKeyUsage
         | 
| 33 59 |  | 
| @@ -41,6 +67,32 @@ module PkernelJce | |
| 41 67 | 
             
            			OCSP_SIGNING = org.bouncycastle.asn1.x509.KeyPurposeId::id_kp_OCSPSigning
         | 
| 42 68 | 
             
            			DVCS = org.bouncycastle.asn1.x509.KeyPurposeId::id_kp_dvcs 
         | 
| 43 69 | 
             
            			SPGP_CERT_AA_SERVER_AUTH = org.bouncycastle.asn1.x509.KeyPurposeId::id_kp_sbgpCertAAServerAuth
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                  EksuMap = {
         | 
| 72 | 
            +
                    :any_eksu => ANY_EXT_KEY_USAGE,
         | 
| 73 | 
            +
                    :tls_server_auth => TLS_SERVER_AUTH,
         | 
| 74 | 
            +
                    :tls_client_auth => TLS_CLIENT_AUTH,
         | 
| 75 | 
            +
                    :code_signing => CODE_SIGNING,
         | 
| 76 | 
            +
                    :email_protection => EMAIL_PROTECTION,
         | 
| 77 | 
            +
                    :timestamping => TIMESTAMPING,
         | 
| 78 | 
            +
                    :ocsp_signing => OCSP_SIGNING,
         | 
| 79 | 
            +
                    :dvcs => DVCS
         | 
| 80 | 
            +
                    #:pgp_cert_Server_auth = SPGP_CERT_AA_SERVER_AUTH
         | 
| 81 | 
            +
                  }
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                  EksuKeyName = {
         | 
| 84 | 
            +
                    :any_eksu => "Any extended key usage",
         | 
| 85 | 
            +
                    :tls_server_auth => "TLS server authentication",
         | 
| 86 | 
            +
                    :tls_client_auth => "TLS client authentication",
         | 
| 87 | 
            +
                    :code_signing => "Code signing",
         | 
| 88 | 
            +
                    :email_protection => "Email protection",
         | 
| 89 | 
            +
                    :timestamping => "Timestamping",
         | 
| 90 | 
            +
                    :ocsp_signing => "OCSP Signing",
         | 
| 91 | 
            +
                    :dvcs => "Data Validation and Certification Server / Trusted Third Party (TTP)"
         | 
| 92 | 
            +
                    #:pgp_cert_Server_auth = "PGP cert server auth?"
         | 
| 93 | 
            +
                  }
         | 
| 94 | 
            +
             | 
| 95 | 
            +
             | 
| 44 96 | 
             
            		end
         | 
| 45 97 | 
             
                # end CertExtKeyUsage
         | 
| 46 98 |  | 
| @@ -57,6 +109,8 @@ module PkernelJce | |
| 57 109 | 
             
                  cProv = params[:cert_provider]
         | 
| 58 110 | 
             
                  issuer = params[:issuer]
         | 
| 59 111 | 
             
                  matchIssuerValidity = params[:match_issuer_validity] || true
         | 
| 112 | 
            +
                  
         | 
| 113 | 
            +
                  warning = { }
         | 
| 60 114 |  | 
| 61 115 | 
             
                  issuer = false if issuer.nil?
         | 
| 62 116 |  | 
| @@ -110,12 +164,28 @@ module PkernelJce | |
| 110 164 |  | 
| 111 165 | 
             
                        if from.to_java_date.before(issuerCert.not_before)
         | 
| 112 166 | 
             
                          PkernelJce::GConf.instance.glog.warn "Certificate valid from has adjusted to match issuer valid from: #{from} [User requested] / #{issuerCert.not_before} [Adjusted to issuer]"
         | 
| 167 | 
            +
                          warning[:valid_from] = { }
         | 
| 168 | 
            +
                          warning[:valid_from][:requested] = from
         | 
| 169 | 
            +
             | 
| 113 170 | 
             
                          from = issuerCert.not_before
         | 
| 171 | 
            +
                          
         | 
| 172 | 
            +
                          warning[:valid_from][:adjusted] = issuerCert.not_before
         | 
| 173 | 
            +
                          warning[:valid_from][:reason] = "Certificate being issued cannot have validity start date before issuer's certificate validity start date."
         | 
| 174 | 
            +
                          block.call(:warning, warning)
         | 
| 175 | 
            +
             | 
| 114 176 | 
             
                        end
         | 
| 115 177 |  | 
| 116 178 | 
             
                        if to.to_java_date.after(issuerCert.not_after)
         | 
| 117 179 | 
             
                          PkernelJce::GConf.instance.glog.warn "Certificate valid to has adjusted to match issuer valid to: #{to} [User requested] / #{issuerCert.not_after} [Adjusted to issuer]"
         | 
| 180 | 
            +
                          
         | 
| 181 | 
            +
                          warning[:valid_to] = { }
         | 
| 182 | 
            +
                          warning[:valid_to][:requested] = to
         | 
| 183 | 
            +
             | 
| 118 184 | 
             
                          to = issuerCert.not_after
         | 
| 185 | 
            +
                          
         | 
| 186 | 
            +
                          warning[:valid_to][:adjusted] = issuerCert.not_after
         | 
| 187 | 
            +
                          warning[:valid_to][:reason] = "Certificate being issued cannot have validity end date after issuer's certificate validity end date."
         | 
| 188 | 
            +
                          block.call(:warning, warning)
         | 
| 119 189 | 
             
                        end
         | 
| 120 190 |  | 
| 121 191 | 
             
                        [from, to]
         | 
| @@ -140,13 +210,30 @@ module PkernelJce | |
| 140 210 | 
             
                  if issuer
         | 
| 141 211 | 
             
                    certGen.addExtension(org.bouncycastle.asn1.x509.Extension::basicConstraints, true, org.bouncycastle.asn1.x509.BasicConstraints.new(true))
         | 
| 142 212 | 
             
                    if not keyUsage.nil?
         | 
| 143 | 
            -
                       | 
| 213 | 
            +
                      if keyUsage.is_a?(Array)
         | 
| 214 | 
            +
                        ku = 0
         | 
| 215 | 
            +
                        keyUsage.each do |u|
         | 
| 216 | 
            +
                          ku |= u
         | 
| 217 | 
            +
                        end
         | 
| 218 | 
            +
                      else
         | 
| 219 | 
            +
                        ku = keyUsage
         | 
| 220 | 
            +
                      end
         | 
| 221 | 
            +
                      
         | 
| 222 | 
            +
                      certGen.addExtension(org.bouncycastle.asn1.x509.Extension::keyUsage, false, org.bouncycastle.asn1.x509.KeyUsage.new(ku))
         | 
| 144 223 | 
             
                    else
         | 
| 145 224 | 
             
                      certGen.addExtension(org.bouncycastle.asn1.x509.Extension::keyUsage, false, org.bouncycastle.asn1.x509.KeyUsage.new(KeyUsage::DEF_ISSUER))
         | 
| 146 225 | 
             
                    end
         | 
| 147 226 | 
             
                  else
         | 
| 148 227 | 
             
                    if not keyUsage.nil?
         | 
| 149 | 
            -
                       | 
| 228 | 
            +
                      if keyUsage.is_a?(Array)
         | 
| 229 | 
            +
                        ku = 0
         | 
| 230 | 
            +
                        keyUsage.each do |u|
         | 
| 231 | 
            +
                          ku |= u
         | 
| 232 | 
            +
                        end
         | 
| 233 | 
            +
                      else
         | 
| 234 | 
            +
                        ku = keyUsage
         | 
| 235 | 
            +
                      end
         | 
| 236 | 
            +
                      certGen.addExtension(org.bouncycastle.asn1.x509.Extension::keyUsage, false, org.bouncycastle.asn1.x509.KeyUsage.new(ku))
         | 
| 150 237 | 
             
                    else
         | 
| 151 238 | 
             
                      certGen.addExtension(org.bouncycastle.asn1.x509.Extension::keyUsage, false, org.bouncycastle.asn1.x509.KeyUsage.new(KeyUsage::DEF_USER_IDENTITY))
         | 
| 152 239 | 
             
                    end
         | 
| @@ -226,6 +313,7 @@ module PkernelJce | |
| 226 313 | 
             
                  certGen.addExtension(org.bouncycastle.asn1.x509.Extension::subjectKeyIdentifier, false, extUtils.createSubjectKeyIdentifier(org.bouncycastle.asn1.x509.SubjectPublicKeyInfo.getInstance(pubKey.getEncoded)))
         | 
| 227 314 |  | 
| 228 315 | 
             
                  cert = org.bouncycastle.cert.jcajce.JcaX509CertificateConverter.new().setProvider(cProv).getCertificate(certGen.build(signer))
         | 
| 316 | 
            +
                  
         | 
| 229 317 | 
             
                  cert
         | 
| 230 318 |  | 
| 231 319 | 
             
                end
         | 
| @@ -239,34 +327,133 @@ module PkernelJce | |
| 239 327 | 
             
                  file = params[:file]
         | 
| 240 328 | 
             
                  baos = java.io.ByteArrayOutputStream.new
         | 
| 241 329 |  | 
| 242 | 
            -
                  if not file.nil?
         | 
| 243 | 
            -
                    PkernelJce::GConf.instance.glog.debug "Dump certificate to file '#{file}'"
         | 
| 244 | 
            -
                    writer = org.bouncycastle.openssl.jcajce.JcaPEMWriter.new(java.io.OutputStreamWriter.new(java.io.FileOutputStream.new(file)))
         | 
| 245 | 
            -
                  else
         | 
| 246 | 
            -
                    PkernelJce::GConf.instance.glog.debug "Dump certificate to memory"
         | 
| 247 | 
            -
                    writer = org.bouncycastle.openssl.jcajce.JcaPEMWriter.new(java.io.OutputStreamWriter.new(baos))
         | 
| 248 | 
            -
                  end
         | 
| 249 | 
            -
             | 
| 250 330 | 
             
                  begin
         | 
| 251 | 
            -
                     | 
| 331 | 
            +
                    
         | 
| 332 | 
            +
                    outForm = params[:out_form] || params[:outForm] || params[:outform]
         | 
| 333 | 
            +
                    if outForm.nil?
         | 
| 334 | 
            +
                  
         | 
| 335 | 
            +
                      if not file.nil?
         | 
| 336 | 
            +
                        PkernelJce::GConf.instance.glog.debug "[D] Dump certificate to file '#{file}'"
         | 
| 337 | 
            +
                        writer = org.bouncycastle.openssl.jcajce.JcaPEMWriter.new(java.io.OutputStreamWriter.new(java.io.FileOutputStream.new(file)))
         | 
| 338 | 
            +
                      else
         | 
| 339 | 
            +
                        PkernelJce::GConf.instance.glog.debug "[D] Dump certificate to memory"
         | 
| 340 | 
            +
                        writer = org.bouncycastle.openssl.jcajce.JcaPEMWriter.new(java.io.OutputStreamWriter.new(baos))
         | 
| 341 | 
            +
                      end
         | 
| 342 | 
            +
             | 
| 343 | 
            +
                      writer.writeObject(cert)
         | 
| 344 | 
            +
                      
         | 
| 345 | 
            +
                    else
         | 
| 346 | 
            +
                      
         | 
| 347 | 
            +
                      case outForm.to_sym
         | 
| 348 | 
            +
                      when :b64, :base64
         | 
| 349 | 
            +
                        res = PkernelJce::Converter.to_b64(cert.encoded)
         | 
| 350 | 
            +
                        if not file.nil?
         | 
| 351 | 
            +
                          fos = java.io.FileOutputStream.new(file)
         | 
| 352 | 
            +
                          fos.write res
         | 
| 353 | 
            +
                          fos.flush
         | 
| 354 | 
            +
                          fos.close
         | 
| 355 | 
            +
                        end
         | 
| 356 | 
            +
                        baos.write(res.to_java.getBytes)
         | 
| 357 | 
            +
                      when :hex
         | 
| 358 | 
            +
                        res = PkernelJce::Converter.to_hex(cert.encoded)
         | 
| 359 | 
            +
                        if not file.nil?
         | 
| 360 | 
            +
                          fos = java.io.FileOutputStream.new(file)
         | 
| 361 | 
            +
                          fos.write res
         | 
| 362 | 
            +
                          fos.flush
         | 
| 363 | 
            +
                          fos.close
         | 
| 364 | 
            +
                        end
         | 
| 365 | 
            +
                        baos.write(res.to_java.getBytes)
         | 
| 366 | 
            +
                      when :bin
         | 
| 367 | 
            +
                        res = cert.encoded
         | 
| 368 | 
            +
                        if not file.nil?
         | 
| 369 | 
            +
                          fos = java.io.FileOutputStream.new(file)
         | 
| 370 | 
            +
                          fos.write res
         | 
| 371 | 
            +
                          fos.flush
         | 
| 372 | 
            +
                          fos.close
         | 
| 373 | 
            +
                        end
         | 
| 374 | 
            +
                        baos.write(res)
         | 
| 375 | 
            +
                      else
         | 
| 376 | 
            +
             | 
| 377 | 
            +
                        # this is default because openssl output this is the default
         | 
| 378 | 
            +
                        if not file.nil?
         | 
| 379 | 
            +
                          PkernelJce::GConf.instance.glog.debug "Dump PEM certificate to file '#{file}'"
         | 
| 380 | 
            +
                          writer = org.bouncycastle.openssl.jcajce.JcaPEMWriter.new(java.io.OutputStreamWriter.new(java.io.FileOutputStream.new(file)))
         | 
| 381 | 
            +
                        else
         | 
| 382 | 
            +
                          PkernelJce::GConf.instance.glog.debug "Dump PEM certificate to memory"
         | 
| 383 | 
            +
                          writer = org.bouncycastle.openssl.jcajce.JcaPEMWriter.new(java.io.OutputStreamWriter.new(baos))
         | 
| 384 | 
            +
                        end
         | 
| 385 | 
            +
             | 
| 386 | 
            +
                        writer.writeObject(cert)
         | 
| 387 | 
            +
             | 
| 388 | 
            +
                      end
         | 
| 389 | 
            +
                    end
         | 
| 390 | 
            +
                  
         | 
| 252 391 | 
             
                  ensure
         | 
| 253 | 
            -
                    writer. | 
| 254 | 
            -
             | 
| 392 | 
            +
                    if not writer.nil?
         | 
| 393 | 
            +
                      writer.flush
         | 
| 394 | 
            +
                      writer.close  
         | 
| 395 | 
            +
                    end
         | 
| 396 | 
            +
             | 
| 397 | 
            +
                    if not fos.nil?
         | 
| 398 | 
            +
                      fos.flush
         | 
| 399 | 
            +
                      fos.close
         | 
| 400 | 
            +
                    end
         | 
| 255 401 | 
             
                  end 
         | 
| 256 402 |  | 
| 257 | 
            -
                   | 
| 258 | 
            -
             | 
| 259 | 
            -
             | 
| 260 | 
            -
             | 
| 403 | 
            +
                  baos.toByteArray
         | 
| 404 | 
            +
             | 
| 405 | 
            +
                end
         | 
| 406 | 
            +
                # end dump
         | 
| 407 | 
            +
             | 
| 408 | 
            +
             | 
| 409 | 
            +
                def dump_to_file(cert, path, opts = { })
         | 
| 410 | 
            +
                  opts = { } if opts.nil?
         | 
| 411 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 412 | 
            +
                  dump(cert, opts.merge({ file: path }))  
         | 
| 413 | 
            +
                end
         | 
| 414 | 
            +
                alias_method :dump_to_file_pem, :dump_to_file
         | 
| 415 | 
            +
                def dump_to_mem(cert, opts = { })
         | 
| 416 | 
            +
                  opts = { } if opts.nil?
         | 
| 417 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 418 | 
            +
                  dump(cert)
         | 
| 419 | 
            +
                end
         | 
| 420 | 
            +
                alias_method :dump_to_mem_pem, :dump_to_mem
         | 
| 421 | 
            +
             | 
| 422 | 
            +
                def dump_to_file_b64(cert, path, opts = { })
         | 
| 423 | 
            +
                  opts = { } if opts.nil?
         | 
| 424 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 425 | 
            +
                  dump(cert, opts.merge({ file: path, outForm: :b64 }))
         | 
| 426 | 
            +
                end
         | 
| 427 | 
            +
                def dump_to_mem_b64(cert, opts = { })
         | 
| 428 | 
            +
                  opts = { } if opts.nil?
         | 
| 429 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 430 | 
            +
                  dump(cert, opts.merge({ outForm: :b64 }))
         | 
| 431 | 
            +
                end
         | 
| 432 | 
            +
             | 
| 433 | 
            +
                def dump_to_file_hex(cert, path, opts = { })
         | 
| 434 | 
            +
                  opts = { } if opts.nil?
         | 
| 435 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 436 | 
            +
                  dump(cert, opts.merge({ file: path, outForm: :hex }))
         | 
| 437 | 
            +
                end
         | 
| 438 | 
            +
                def dump_to_mem_hex(cert, opts = { })
         | 
| 439 | 
            +
                  opts = { } if opts.nil?
         | 
| 440 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 441 | 
            +
                  dump(cert, opts.merge({ outForm: :hex }))
         | 
| 442 | 
            +
                end
         | 
| 443 | 
            +
             | 
| 444 | 
            +
                def dump_to_file_bin(cert, path, opts = { })
         | 
| 445 | 
            +
                  opts = { } if opts.nil?
         | 
| 446 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 447 | 
            +
                  dump(cert, opts.merge({ file: path, outForm: :bin }))
         | 
| 448 | 
            +
                end
         | 
| 449 | 
            +
                def dump_to_mem_bin(cert, opts = { })
         | 
| 450 | 
            +
                  opts = { } if opts.nil?
         | 
| 451 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 452 | 
            +
                  dump(cert, opts.merge({ outForm: :bin }))
         | 
| 261 453 | 
             
                end
         | 
| 262 | 
            -
                # end write to
         | 
| 263 454 |  | 
| 264 455 |  | 
| 265 456 | 
             
                def load(options = {})
         | 
| 266 | 
            -
                  #is = options[:inputStream]
         | 
| 267 | 
            -
                  #if is.nil?
         | 
| 268 | 
            -
                  #  raise PkernelJce::Error, "InputStream to load certificate is nil"
         | 
| 269 | 
            -
                  #end
         | 
| 270 457 |  | 
| 271 458 | 
             
                  file = options[:file]
         | 
| 272 459 | 
             
                  bin = options[:bin]
         | 
| @@ -288,20 +475,189 @@ module PkernelJce | |
| 288 475 |  | 
| 289 476 | 
             
                  elsif not bin.nil?
         | 
| 290 477 | 
             
                    PkernelJce::GConf.instance.glog.debug "Load certificate from memory"
         | 
| 478 | 
            +
                    bin = IoUtils.ensure_java_bytes(bin)
         | 
| 291 479 | 
             
                    baos.write(bin)
         | 
| 292 480 | 
             
                  else
         | 
| 293 481 | 
             
                    raise PkernelJce::Error, "No bin or file input is given to load"
         | 
| 294 482 | 
             
                  end
         | 
| 295 483 |  | 
| 296 | 
            -
                   | 
| 297 | 
            -
                   | 
| 298 | 
            -
             | 
| 299 | 
            -
             | 
| 300 | 
            -
             | 
| 301 | 
            -
             | 
| 484 | 
            +
                  inForm = options[:in_form] || options[:inForm] || options[:inform]
         | 
| 485 | 
            +
                  if not inForm.nil?
         | 
| 486 | 
            +
                    case inForm.to_sym
         | 
| 487 | 
            +
                    when :b64, :base64
         | 
| 488 | 
            +
                      PkernelJce::GConf.instance.glog.debug "Loading b64 certificate"
         | 
| 489 | 
            +
                      cbin = Pkernel::Converter.from_b64(baos.toByteArray)
         | 
| 490 | 
            +
                    when :hex
         | 
| 491 | 
            +
                      PkernelJce::GConf.instance.glog.debug "Loading hex certificate"
         | 
| 492 | 
            +
                      cbin = Pkernel::Converter.from_hex(baos.toByteArray)
         | 
| 493 | 
            +
                    when :bin
         | 
| 494 | 
            +
                      PkernelJce::GConf.instance.glog.debug "Loading bin certificate"
         | 
| 495 | 
            +
                      cbin = baos.toByteArray
         | 
| 496 | 
            +
                    else
         | 
| 497 | 
            +
                      PkernelJce::GConf.instance.glog.debug "Loading pem certificate"
         | 
| 498 | 
            +
                      reader = org.bouncycastle.openssl.PEMParser.new(java.io.InputStreamReader.new(java.io.ByteArrayInputStream.new(baos.toByteArray)))
         | 
| 499 | 
            +
                      if options[:multiple]
         | 
| 500 | 
            +
                        obj = []
         | 
| 501 | 
            +
                        o = reader.readObject
         | 
| 502 | 
            +
                        while(o != nil)
         | 
| 503 | 
            +
                          obj << o
         | 
| 504 | 
            +
                          o = reader.readObject
         | 
| 505 | 
            +
                        end
         | 
| 506 | 
            +
                      else
         | 
| 507 | 
            +
                        obj = reader.readObject
         | 
| 508 | 
            +
                      end
         | 
| 509 | 
            +
                    end
         | 
| 510 | 
            +
                  
         | 
| 511 | 
            +
                  else
         | 
| 512 | 
            +
                    PkernelJce::GConf.instance.glog.debug "Loading pem certificate (2)"
         | 
| 513 | 
            +
                    reader = org.bouncycastle.openssl.PEMParser.new(java.io.InputStreamReader.new(java.io.ByteArrayInputStream.new(baos.toByteArray)))
         | 
| 514 | 
            +
                    if options[:multiple]
         | 
| 515 | 
            +
                      obj = []
         | 
| 516 | 
            +
                      o = reader.readObject
         | 
| 517 | 
            +
                      while(o != nil)
         | 
| 518 | 
            +
                        obj << o
         | 
| 519 | 
            +
                        o = reader.readObject
         | 
| 520 | 
            +
                      end
         | 
| 521 | 
            +
                    else
         | 
| 522 | 
            +
                      obj = reader.readObject
         | 
| 523 | 
            +
                    end
         | 
| 524 | 
            +
                  end
         | 
| 525 | 
            +
             | 
| 526 | 
            +
                  if not cbin.nil?
         | 
| 527 | 
            +
                    cf = java.security.cert.CertificateFactory.getInstance("X.509")
         | 
| 528 | 
            +
                    if options[:multiple]
         | 
| 529 | 
            +
                      obj = cf.generateCertificates(java.io.ByteArrayInputStream.new(baos.toByteArray))
         | 
| 530 | 
            +
                    else
         | 
| 531 | 
            +
                      obj = cf.generateCertificate(java.io.ByteArrayInputStream.new(baos.toByteArray))
         | 
| 532 | 
            +
                    end
         | 
| 533 | 
            +
                  end
         | 
| 534 | 
            +
             | 
| 535 | 
            +
                  if not obj.nil?
         | 
| 536 | 
            +
                    obj
         | 
| 537 | 
            +
                  else
         | 
| 538 | 
            +
                    raise PkernelJce::Error, "No valid certificate object loaded."
         | 
| 539 | 
            +
                  end
         | 
| 540 | 
            +
             | 
| 302 541 | 
             
                end
         | 
| 303 542 | 
             
                # end read_from
         | 
| 304 543 |  | 
| 544 | 
            +
                def load_from_file(file, opts = { })
         | 
| 545 | 
            +
                  opts = { } if opts.nil?
         | 
| 546 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 547 | 
            +
                  load(opts.merge({ file: file }))   
         | 
| 548 | 
            +
                end
         | 
| 549 | 
            +
                alias_method :load_from_file_pem, :load_from_file
         | 
| 550 | 
            +
                
         | 
| 551 | 
            +
                def load_from_mem(bin, opts = { })
         | 
| 552 | 
            +
                  opts = { } if opts.nil?
         | 
| 553 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 554 | 
            +
                  load(opts.merge({ bin: bin }))   
         | 
| 555 | 
            +
                end
         | 
| 556 | 
            +
                alias_method :load_from_mem_pem, :load_from_mem
         | 
| 557 | 
            +
             | 
| 558 | 
            +
             | 
| 559 | 
            +
                def load_multi_from_file(file, opts = { })
         | 
| 560 | 
            +
                  opts = { } if opts.nil?
         | 
| 561 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 562 | 
            +
                  load({ file: file, multiple: true })   
         | 
| 563 | 
            +
                end
         | 
| 564 | 
            +
                alias_method :load_multi_from_file_pem, :load_multi_from_file
         | 
| 565 | 
            +
             | 
| 566 | 
            +
                def load_multi_from_mem(bin, opts = { })
         | 
| 567 | 
            +
                  opts = { } if opts.nil?
         | 
| 568 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 569 | 
            +
                  load({ bin: bin, multiple: true })   
         | 
| 570 | 
            +
                end
         | 
| 571 | 
            +
                alias_method :load_multi_from_bin_pem, :load_multi_from_mem
         | 
| 572 | 
            +
             | 
| 573 | 
            +
             | 
| 574 | 
            +
                
         | 
| 575 | 
            +
                def load_from_file_b64(file, opts = { })
         | 
| 576 | 
            +
                  opts = { } if opts.nil?
         | 
| 577 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 578 | 
            +
                  load({ file: file, inForm: :b64 })   
         | 
| 579 | 
            +
                end
         | 
| 580 | 
            +
                def load_from_mem_b64(bin, opts = { })
         | 
| 581 | 
            +
                  opts = { } if opts.nil?
         | 
| 582 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 583 | 
            +
                  load({ bin: bin, inForm: :b64 })   
         | 
| 584 | 
            +
                end
         | 
| 585 | 
            +
             | 
| 586 | 
            +
             | 
| 587 | 
            +
                def load_multi_from_file_b64(file, opts = { })
         | 
| 588 | 
            +
                  opts = { } if opts.nil?
         | 
| 589 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 590 | 
            +
                  load({ file: file, inForm: :b64, multiple: true })   
         | 
| 591 | 
            +
                end
         | 
| 592 | 
            +
                def load_multi_from_mem_b64(bin, opts = { })
         | 
| 593 | 
            +
                  opts = { } if opts.nil?
         | 
| 594 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 595 | 
            +
                  load({ bin: bin, inForm: :b64, multiple: true })   
         | 
| 596 | 
            +
                end
         | 
| 597 | 
            +
             | 
| 598 | 
            +
                
         | 
| 599 | 
            +
                def load_from_file_hex(file, opts = { })
         | 
| 600 | 
            +
                  opts = { } if opts.nil?
         | 
| 601 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 602 | 
            +
                  load({ file: file, inForm: :hex })   
         | 
| 603 | 
            +
                end
         | 
| 604 | 
            +
                def load_from_mem_hex(bin, opts = { })
         | 
| 605 | 
            +
                  opts = { } if opts.nil?
         | 
| 606 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 607 | 
            +
                  load({ bin: bin, inForm: :hex })   
         | 
| 608 | 
            +
                end
         | 
| 609 | 
            +
             | 
| 610 | 
            +
             | 
| 611 | 
            +
                def load_multi_from_file_hex(file, opts = { })
         | 
| 612 | 
            +
                  opts = { } if opts.nil?
         | 
| 613 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 614 | 
            +
                  load({ file: file, inForm: :hex, multiple: true })   
         | 
| 615 | 
            +
                end
         | 
| 616 | 
            +
                def load_multi_from_mem_hex(bin, opts = { })
         | 
| 617 | 
            +
                  opts = { } if opts.nil?
         | 
| 618 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 619 | 
            +
                  load({ bin: bin, inForm: :hex, multiple: true })   
         | 
| 620 | 
            +
                end
         | 
| 621 | 
            +
             | 
| 622 | 
            +
             | 
| 623 | 
            +
                def load_from_file_bin(file, opts = { })
         | 
| 624 | 
            +
                  opts = { } if opts.nil?
         | 
| 625 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 626 | 
            +
                  load({ file: file, inForm: :bin })   
         | 
| 627 | 
            +
                end
         | 
| 628 | 
            +
                def load_from_mem_bin(bin, opts = { })
         | 
| 629 | 
            +
                  opts = { } if opts.nil?
         | 
| 630 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 631 | 
            +
                  load({ bin: bin, inForm: :bin })   
         | 
| 632 | 
            +
                end
         | 
| 633 | 
            +
             | 
| 634 | 
            +
             | 
| 635 | 
            +
                def load_multi_from_file_bin(file, opts = { })
         | 
| 636 | 
            +
                  opts = { } if opts.nil?
         | 
| 637 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 638 | 
            +
                  load({ file: file, inForm: :bin, multiple: true })   
         | 
| 639 | 
            +
                end
         | 
| 640 | 
            +
                def load_multi_from_bin_bin(bin, opts = { })
         | 
| 641 | 
            +
                  opts = { } if opts.nil?
         | 
| 642 | 
            +
                  raise PkernelJce::Error, "Options should be a hash" if not opts.is_a?(Hash)
         | 
| 643 | 
            +
                  load({ bin: bin, inForm: :bin, multiple: true })   
         | 
| 644 | 
            +
                end
         | 
| 645 | 
            +
             | 
| 646 | 
            +
             | 
| 647 | 
            +
                # this is necessary because OpenSSL or Ruby 
         | 
| 648 | 
            +
                # not recognizing the .encoded method, unless
         | 
| 649 | 
            +
                # patch all Certificate object in other realm 
         | 
| 650 | 
            +
                # with the .encoded method else this is the cleaner way to do it
         | 
| 651 | 
            +
                def Certificate.to_binary(cert)
         | 
| 652 | 
            +
                  if not cert.nil?
         | 
| 653 | 
            +
                    cert
         | 
| 654 | 
            +
                  else
         | 
| 655 | 
            +
                    cert.encoded
         | 
| 656 | 
            +
                  end
         | 
| 657 | 
            +
                end
         | 
| 658 | 
            +
                # end to_binary()
         | 
| 659 | 
            +
             | 
| 660 | 
            +
                # if_self_signed?
         | 
| 305 661 | 
             
                def Certificate.is_self_signed?(cert) 
         | 
| 306 662 | 
             
                  if cert.nil?
         | 
| 307 663 | 
             
                    false
         | 
| @@ -413,6 +769,65 @@ module PkernelJce | |
| 413 769 | 
             
                  extKey.hasKeyPurposeId(eku)
         | 
| 414 770 | 
             
                end
         | 
| 415 771 |  | 
| 772 | 
            +
                def Certificate.is_equal?(cert1,cert2)
         | 
| 773 | 
            +
                  if not (Certificate.is_cert_object?(cert1) or Certificate.is_cert_object?(cert2))
         | 
| 774 | 
            +
                    false
         | 
| 775 | 
            +
                  else
         | 
| 776 | 
            +
                    Certificate.ensure_java_cert(cert1).equals(Certificate.ensure_java_cert(cert2))
         | 
| 777 | 
            +
                  end
         | 
| 778 | 
            +
                end
         | 
| 779 | 
            +
             | 
| 780 | 
            +
                # Support fields key
         | 
| 781 | 
            +
                # :cn, :e, :ou, :o, :c
         | 
| 782 | 
            +
                def Certificate.get_subject_fields(cert,fields)
         | 
| 783 | 
            +
                  if fields.is_a?(Array)
         | 
| 784 | 
            +
                  else
         | 
| 785 | 
            +
                    fields = [fields]
         | 
| 786 | 
            +
                  end
         | 
| 787 | 
            +
             | 
| 788 | 
            +
                  fields.map! { |f| f.to_s.upcase }
         | 
| 789 | 
            +
             | 
| 790 | 
            +
                  res = { }
         | 
| 791 | 
            +
                  if cert.nil?
         | 
| 792 | 
            +
                    return ""
         | 
| 793 | 
            +
                  else
         | 
| 794 | 
            +
                    subj = Certificate.to_java_cert(cert).getSubjectDN.getName
         | 
| 795 | 
            +
                    subj.split(",").each do |s|
         | 
| 796 | 
            +
                      ss = s.split("=")
         | 
| 797 | 
            +
                      if fields.include?(ss[0])
         | 
| 798 | 
            +
                        key = ss[0].downcase.to_sym
         | 
| 799 | 
            +
                        res[key] = []
         | 
| 800 | 
            +
                        res[key] << ss[1]
         | 
| 801 | 
            +
                      end 
         | 
| 802 | 
            +
                    end
         | 
| 803 | 
            +
                  end
         | 
| 804 | 
            +
             | 
| 805 | 
            +
                  res
         | 
| 806 | 
            +
                end
         | 
| 807 | 
            +
                # end get_subject_fields
         | 
| 808 | 
            +
             | 
| 809 | 
            +
                def Certificate.parse_into_fields(cert)
         | 
| 810 | 
            +
                  res = { }
         | 
| 811 | 
            +
                  if not cert.nil?
         | 
| 812 | 
            +
                    c = Certificate.to_java_cert(cert)
         | 
| 813 | 
            +
                    res[:subject] = c.getSubjectDN.to_s
         | 
| 814 | 
            +
                    res[:issuer] = c.getIssuerDN.to_s
         | 
| 815 | 
            +
                    res[:serialNo] = c.serial_number
         | 
| 816 | 
            +
                    res[:notBefore] = c.notBefore
         | 
| 817 | 
            +
                    res[:notAfter] = c.notAfter
         | 
| 818 | 
            +
                    res[:keyType] = Pkernel::KeyPair::pub_key_type(Certificate.public_key(c))
         | 
| 819 | 
            +
                    #res[:keyUsage] =
         | 
| 820 | 
            +
                    #res[:extKeyUsage] = 
         | 
| 821 | 
            +
                    #res[:subjKeyId] =
         | 
| 822 | 
            +
                    #res[:authKeyId] =
         | 
| 823 | 
            +
                    #res[:crl] = 
         | 
| 824 | 
            +
                    #res[:ocsp] = 
         | 
| 825 | 
            +
                    #res[:altName] = 
         | 
| 826 | 
            +
                  end
         | 
| 827 | 
            +
             | 
| 828 | 
            +
                  res
         | 
| 829 | 
            +
                end
         | 
| 830 | 
            +
             | 
| 416 831 | 
             
                private
         | 
| 417 832 | 
             
                # 
         | 
| 418 833 | 
             
                # all date must be in Ruby datetime object?
         | 
| @@ -430,6 +845,10 @@ module PkernelJce | |
| 430 845 | 
             
                  end
         | 
| 431 846 |  | 
| 432 847 | 
             
                  if validFrom.is_a?(Time) #or validFrom.is_a?(DateTime)
         | 
| 848 | 
            +
                  elsif validFrom.is_a?(DateTime)
         | 
| 849 | 
            +
                    # this has to be converted because if using DateTime object 
         | 
| 850 | 
            +
                    # there will be error of 'nsec' not available exception
         | 
| 851 | 
            +
                    validFrom = validFrom.to_time
         | 
| 433 852 | 
             
                  else
         | 
| 434 853 | 
             
                    raise PkernelJce::Error, "Invalid valid from date object type : '#{validFrom.class}'"
         | 
| 435 854 | 
             
                  end 
         | 
| @@ -438,7 +857,8 @@ module PkernelJce | |
| 438 857 | 
             
                    if (validity.nil?) and (validityUnit.nil?)
         | 
| 439 858 | 
             
                      raise PkernelJce::Error, "Valid until and validity period both are not defined."
         | 
| 440 859 | 
             
                    else
         | 
| 441 | 
            -
                      validTo = validFrom.advance( validityUnit => validity )
         | 
| 860 | 
            +
                      validTo = validFrom.advance( validityUnit.to_sym => validity.to_i )
         | 
| 861 | 
            +
                      PkernelJce::GConf.instance.glog.debug "Validity unit : #{validityUnit}, validity : #{validity}, valid from : #{validFrom}, valid to : #{validTo}" 
         | 
| 442 862 | 
             
                      if block
         | 
| 443 863 | 
             
                        # allow caller to check with issuer validity see if the valid to already surpass issuer's valid to
         | 
| 444 864 | 
             
                        #validTo = block.call(validFrom, validTo)
         |