final class com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils
  minor version: 0
  major version: 59
  flags: flags: (0x0030) ACC_FINAL, ACC_SUPER
  this_class: com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils
  super_class: java.lang.Object
{
  private static final java.lang.String PKCS12_ALG;
    descriptor: Ljava/lang/String;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    ConstantValue: "PKCS12"

  private static final java.lang.String SUN_X_509;
    descriptor: Ljava/lang/String;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    ConstantValue: "SunX509"

  private static final java.lang.String PEM_PRIVATE_START;
    descriptor: Ljava/lang/String;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    ConstantValue: "-----BEGIN PRIVATE KEY-----"

  private static final java.lang.String PEM_PRIVATE_END;
    descriptor: Ljava/lang/String;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    ConstantValue: "-----END PRIVATE KEY-----"

  private static final java.lang.String JAVA_KEY_STORE;
    descriptor: Ljava/lang/String;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    ConstantValue: "JKS"

  private static final java.lang.String CLIENT_CERT;
    descriptor: Ljava/lang/String;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    ConstantValue: "client-cert"

  private static final java.lang.String CLIENT_KEY;
    descriptor: Ljava/lang/String;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    ConstantValue: "client-key"

  private static final java.lang.String PEM_RSA_PRIVATE_START;
    descriptor: Ljava/lang/String;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    ConstantValue: "-----BEGIN RSA PRIVATE KEY-----"

  private static final long PVK_MAGIC;
    descriptor: J
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    ConstantValue: 2964713758

  private static final byte[] RSA2_MAGIC;
    descriptor: [B
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL

  private static final java.lang.String RC4_ALG;
    descriptor: Ljava/lang/String;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    ConstantValue: "RC4"

  private static final java.lang.String RSA_ALG;
    descriptor: Ljava/lang/String;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    ConstantValue: "RSA"

  static void <clinit>();
    descriptor: ()V
    flags: (0x0008) ACC_STATIC
    Code:
      stack=4, locals=0, args_size=0
         0: .line 79
            iconst_4
            newarray 8
            dup
            iconst_0
            bipush 82
            bastore
            dup
            iconst_1
            bipush 83
            bastore
            dup
            iconst_2
            bipush 65
            bastore
            dup
            iconst_3
            bipush 50
            bastore
            putstatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.RSA2_MAGIC:[B
         1: .line 81
            return
      LocalVariableTable:
        Start  End  Slot  Name  Signature

  void <init>();
    descriptor: ()V
    flags: (0x0000) 
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils this
         0: .line 55
            aload 0 /* this */
            invokespecial java.lang.Object.<init>:()V
            return
        end local 0 // com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    1     0  this  Lcom/microsoft/sqlserver/jdbc/SQLServerCertificateUtils;

  static javax.net.ssl.KeyManager[] getKeyManagerFromFile(java.lang.String, java.lang.String, java.lang.String);
    descriptor: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)[Ljavax/net/ssl/KeyManager;
    flags: (0x0008) ACC_STATIC
    Code:
      stack=3, locals=3, args_size=3
        start local 0 // java.lang.String certPath
        start local 1 // java.lang.String keyPath
        start local 2 // java.lang.String keyPassword
         0: .line 59
            aload 1 /* keyPath */
            ifnull 2
            aload 1 /* keyPath */
            invokevirtual java.lang.String.length:()I
            ifle 2
         1: .line 60
            aload 0 /* certPath */
            aload 1 /* keyPath */
            aload 2 /* keyPassword */
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.readPKCS8Certificate:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)[Ljavax/net/ssl/KeyManager;
            areturn
         2: .line 62
      StackMap locals:
      StackMap stack:
            aload 0 /* certPath */
            aload 2 /* keyPassword */
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.readPKCS12Certificate:(Ljava/lang/String;Ljava/lang/String;)[Ljavax/net/ssl/KeyManager;
            areturn
        end local 2 // java.lang.String keyPassword
        end local 1 // java.lang.String keyPath
        end local 0 // java.lang.String certPath
      LocalVariableTable:
        Start  End  Slot         Name  Signature
            0    3     0     certPath  Ljava/lang/String;
            0    3     1      keyPath  Ljava/lang/String;
            0    3     2  keyPassword  Ljava/lang/String;
    Exceptions:
      throws java.io.IOException, java.security.GeneralSecurityException, com.microsoft.sqlserver.jdbc.SQLServerException
    MethodParameters:
             Name  Flags
      certPath     
      keyPath      
      keyPassword  

  private static javax.net.ssl.KeyManager[] readPKCS12Certificate(java.lang.String, java.lang.String);
    descriptor: (Ljava/lang/String;Ljava/lang/String;)[Ljavax/net/ssl/KeyManager;
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=6, locals=6, args_size=2
        start local 0 // java.lang.String certPath
        start local 1 // java.lang.String keyPassword
         0: .line 85
            ldc "PKCS12"
            invokestatic java.security.KeyStore.getInstance:(Ljava/lang/String;)Ljava/security/KeyStore;
            astore 2 /* keystore */
        start local 2 // java.security.KeyStore keystore
         1: .line 86
            aconst_null
            astore 3
            aconst_null
            astore 4
         2: new java.io.FileInputStream
            dup
            aload 0 /* certPath */
            invokespecial java.io.FileInputStream.<init>:(Ljava/lang/String;)V
            astore 5 /* certStream */
        start local 5 // java.io.FileInputStream certStream
         3: .line 87
            aload 2 /* keystore */
            aload 5 /* certStream */
            aload 1 /* keyPassword */
            invokevirtual java.lang.String.toCharArray:()[C
            invokevirtual java.security.KeyStore.load:(Ljava/io/InputStream;[C)V
         4: .line 88
            aload 5 /* certStream */
            ifnull 12
            aload 5 /* certStream */
            invokevirtual java.io.FileInputStream.close:()V
            goto 12
      StackMap locals: java.lang.String java.lang.String java.security.KeyStore java.lang.Throwable java.lang.Throwable java.io.FileInputStream
      StackMap stack: java.lang.Throwable
         5: astore 3
            aload 5 /* certStream */
            ifnull 6
            aload 5 /* certStream */
            invokevirtual java.io.FileInputStream.close:()V
        end local 5 // java.io.FileInputStream certStream
      StackMap locals:
      StackMap stack:
         6: aload 3
            athrow
      StackMap locals:
      StackMap stack: java.lang.Throwable
         7: astore 4
            aload 3
            ifnonnull 8
            aload 4
            astore 3
            goto 9
      StackMap locals:
      StackMap stack:
         8: aload 3
            aload 4
            if_acmpeq 9
            aload 3
            aload 4
            invokevirtual java.lang.Throwable.addSuppressed:(Ljava/lang/Throwable;)V
      StackMap locals:
      StackMap stack:
         9: aload 3
            athrow
      StackMap locals: java.lang.String java.lang.String java.security.KeyStore
      StackMap stack: java.io.FileNotFoundException
        10: pop
        11: .line 89
            new com.microsoft.sqlserver.jdbc.SQLServerException
            dup
            ldc "R_clientCertError"
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerException.getErrString:(Ljava/lang/String;)Ljava/lang/String;
            aconst_null
            iconst_0
            aconst_null
            invokespecial com.microsoft.sqlserver.jdbc.SQLServerException.<init>:(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V
            athrow
        12: .line 91
      StackMap locals:
      StackMap stack:
            ldc "SunX509"
            invokestatic javax.net.ssl.KeyManagerFactory.getInstance:(Ljava/lang/String;)Ljavax/net/ssl/KeyManagerFactory;
            astore 3 /* keyManagerFactory */
        start local 3 // javax.net.ssl.KeyManagerFactory keyManagerFactory
        13: .line 92
            aload 3 /* keyManagerFactory */
            aload 2 /* keystore */
            aload 1 /* keyPassword */
            invokevirtual java.lang.String.toCharArray:()[C
            invokevirtual javax.net.ssl.KeyManagerFactory.init:(Ljava/security/KeyStore;[C)V
        14: .line 93
            aload 3 /* keyManagerFactory */
            invokevirtual javax.net.ssl.KeyManagerFactory.getKeyManagers:()[Ljavax/net/ssl/KeyManager;
            areturn
        end local 3 // javax.net.ssl.KeyManagerFactory keyManagerFactory
        end local 2 // java.security.KeyStore keystore
        end local 1 // java.lang.String keyPassword
        end local 0 // java.lang.String certPath
      LocalVariableTable:
        Start  End  Slot               Name  Signature
            0   15     0           certPath  Ljava/lang/String;
            0   15     1        keyPassword  Ljava/lang/String;
            1   15     2           keystore  Ljava/security/KeyStore;
            3    6     5         certStream  Ljava/io/FileInputStream;
           13   15     3  keyManagerFactory  Ljavax/net/ssl/KeyManagerFactory;
      Exception table:
        from    to  target  type
           3     4       5  any
           2     7       7  any
           1    10      10  Class java.io.FileNotFoundException
    Exceptions:
      throws java.security.NoSuchAlgorithmException, java.security.cert.CertificateException, java.io.FileNotFoundException, java.io.IOException, java.security.UnrecoverableKeyException, java.security.KeyStoreException, com.microsoft.sqlserver.jdbc.SQLServerException
    MethodParameters:
             Name  Flags
      certPath     
      keyPassword  

  private static javax.net.ssl.KeyManager[] readPKCS8Certificate(java.lang.String, java.lang.String, java.lang.String);
    descriptor: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)[Ljavax/net/ssl/KeyManager;
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=8, locals=7, args_size=3
        start local 0 // java.lang.String certPath
        start local 1 // java.lang.String keyPath
        start local 2 // java.lang.String keyPassword
         0: .line 98
            aload 0 /* certPath */
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.loadCertificate:(Ljava/lang/String;)Ljava/security/cert/Certificate;
            astore 3 /* clientCertificate */
        start local 3 // java.security.cert.Certificate clientCertificate
         1: .line 99
            aload 3 /* clientCertificate */
            checkcast java.security.cert.X509Certificate
            invokevirtual java.security.cert.X509Certificate.checkValidity:()V
         2: .line 100
            aload 1 /* keyPath */
            aload 2 /* keyPassword */
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.loadPrivateKey:(Ljava/lang/String;Ljava/lang/String;)Ljava/security/PrivateKey;
            astore 4 /* privateKey */
        start local 4 // java.security.PrivateKey privateKey
         3: .line 102
            ldc "JKS"
            invokestatic java.security.KeyStore.getInstance:(Ljava/lang/String;)Ljava/security/KeyStore;
            astore 5 /* keyStore */
        start local 5 // java.security.KeyStore keyStore
         4: .line 103
            aload 5 /* keyStore */
            aconst_null
            aconst_null
            invokevirtual java.security.KeyStore.load:(Ljava/io/InputStream;[C)V
         5: .line 104
            aload 5 /* keyStore */
            ldc "client-cert"
            aload 3 /* clientCertificate */
            invokevirtual java.security.KeyStore.setCertificateEntry:(Ljava/lang/String;Ljava/security/cert/Certificate;)V
         6: .line 105
            aload 5 /* keyStore */
            ldc "client-key"
            aload 4 /* privateKey */
            aload 2 /* keyPassword */
            invokevirtual java.lang.String.toCharArray:()[C
            iconst_1
            anewarray java.security.cert.Certificate
            dup
            iconst_0
            aload 3 /* clientCertificate */
            aastore
            invokevirtual java.security.KeyStore.setKeyEntry:(Ljava/lang/String;Ljava/security/Key;[C[Ljava/security/cert/Certificate;)V
         7: .line 107
            invokestatic javax.net.ssl.KeyManagerFactory.getDefaultAlgorithm:()Ljava/lang/String;
            invokestatic javax.net.ssl.KeyManagerFactory.getInstance:(Ljava/lang/String;)Ljavax/net/ssl/KeyManagerFactory;
            astore 6 /* kmf */
        start local 6 // javax.net.ssl.KeyManagerFactory kmf
         8: .line 108
            aload 6 /* kmf */
            aload 5 /* keyStore */
            aload 2 /* keyPassword */
            invokevirtual java.lang.String.toCharArray:()[C
            invokevirtual javax.net.ssl.KeyManagerFactory.init:(Ljava/security/KeyStore;[C)V
         9: .line 109
            aload 6 /* kmf */
            invokevirtual javax.net.ssl.KeyManagerFactory.getKeyManagers:()[Ljavax/net/ssl/KeyManager;
            areturn
        end local 6 // javax.net.ssl.KeyManagerFactory kmf
        end local 5 // java.security.KeyStore keyStore
        end local 4 // java.security.PrivateKey privateKey
        end local 3 // java.security.cert.Certificate clientCertificate
        end local 2 // java.lang.String keyPassword
        end local 1 // java.lang.String keyPath
        end local 0 // java.lang.String certPath
      LocalVariableTable:
        Start  End  Slot               Name  Signature
            0   10     0           certPath  Ljava/lang/String;
            0   10     1            keyPath  Ljava/lang/String;
            0   10     2        keyPassword  Ljava/lang/String;
            1   10     3  clientCertificate  Ljava/security/cert/Certificate;
            3   10     4         privateKey  Ljava/security/PrivateKey;
            4   10     5           keyStore  Ljava/security/KeyStore;
            8   10     6                kmf  Ljavax/net/ssl/KeyManagerFactory;
    Exceptions:
      throws java.io.IOException, java.security.GeneralSecurityException, com.microsoft.sqlserver.jdbc.SQLServerException
    MethodParameters:
             Name  Flags
      certPath     
      keyPath      
      keyPassword  

  private static java.security.PrivateKey loadPrivateKeyFromPKCS8(java.lang.String);
    descriptor: (Ljava/lang/String;)Ljava/security/PrivateKey;
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=4, locals=4, args_size=1
        start local 0 // java.lang.String key
         0: .line 114
            new java.lang.StringBuilder
            dup
            aload 0 /* key */
            invokespecial java.lang.StringBuilder.<init>:(Ljava/lang/String;)V
            astore 1 /* sb */
        start local 1 // java.lang.StringBuilder sb
         1: .line 115
            aload 1 /* sb */
            ldc "-----BEGIN PRIVATE KEY-----"
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.deleteFirst:(Ljava/lang/StringBuilder;Ljava/lang/String;)V
         2: .line 116
            aload 1 /* sb */
            ldc "-----END PRIVATE KEY-----"
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.deleteFirst:(Ljava/lang/StringBuilder;Ljava/lang/String;)V
         3: .line 117
            invokestatic java.util.Base64.getDecoder:()Ljava/util/Base64$Decoder;
            aload 1 /* sb */
            invokevirtual java.lang.StringBuilder.toString:()Ljava/lang/String;
            ldc "\\s"
            ldc ""
            invokevirtual java.lang.String.replaceAll:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
            invokevirtual java.util.Base64$Decoder.decode:(Ljava/lang/String;)[B
            astore 2 /* formattedKey */
        start local 2 // byte[] formattedKey
         4: .line 119
            ldc "RSA"
            invokestatic java.security.KeyFactory.getInstance:(Ljava/lang/String;)Ljava/security/KeyFactory;
            astore 3 /* factory */
        start local 3 // java.security.KeyFactory factory
         5: .line 120
            aload 3 /* factory */
            new java.security.spec.PKCS8EncodedKeySpec
            dup
            aload 2 /* formattedKey */
            invokespecial java.security.spec.PKCS8EncodedKeySpec.<init>:([B)V
            invokevirtual java.security.KeyFactory.generatePrivate:(Ljava/security/spec/KeySpec;)Ljava/security/PrivateKey;
            areturn
        end local 3 // java.security.KeyFactory factory
        end local 2 // byte[] formattedKey
        end local 1 // java.lang.StringBuilder sb
        end local 0 // java.lang.String key
      LocalVariableTable:
        Start  End  Slot          Name  Signature
            0    6     0           key  Ljava/lang/String;
            1    6     1            sb  Ljava/lang/StringBuilder;
            4    6     2  formattedKey  [B
            5    6     3       factory  Ljava/security/KeyFactory;
    Exceptions:
      throws java.io.IOException, java.security.NoSuchAlgorithmException, java.security.spec.InvalidKeySpecException
    MethodParameters:
      Name  Flags
      key   

  private static void deleteFirst(java.lang.StringBuilder, java.lang.String);
    descriptor: (Ljava/lang/StringBuilder;Ljava/lang/String;)V
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=4, locals=3, args_size=2
        start local 0 // java.lang.StringBuilder sb
        start local 1 // java.lang.String str
         0: .line 124
            aload 0 /* sb */
            aload 1 /* str */
            invokevirtual java.lang.StringBuilder.indexOf:(Ljava/lang/String;)I
            istore 2 /* i */
        start local 2 // int i
         1: .line 125
            iload 2 /* i */
            iconst_m1
            if_icmpeq 3
         2: .line 126
            aload 0 /* sb */
            iload 2 /* i */
            iload 2 /* i */
            aload 1 /* str */
            invokevirtual java.lang.String.length:()I
            iadd
            invokevirtual java.lang.StringBuilder.delete:(II)Ljava/lang/StringBuilder;
            pop
         3: .line 128
      StackMap locals: int
      StackMap stack:
            return
        end local 2 // int i
        end local 1 // java.lang.String str
        end local 0 // java.lang.StringBuilder sb
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    4     0    sb  Ljava/lang/StringBuilder;
            0    4     1   str  Ljava/lang/String;
            1    4     2     i  I
    MethodParameters:
      Name  Flags
      sb    
      str   

  private static java.security.PrivateKey loadPrivateKeyFromPKCS1(java.lang.String, java.lang.String);
    descriptor: (Ljava/lang/String;Ljava/lang/String;)Ljava/security/PrivateKey;
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=5, locals=9, args_size=2
        start local 0 // java.lang.String key
        start local 1 // java.lang.String keyPass
         0: .line 132
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerBouncyCastleLoader.loadBouncyCastle:()V
         1: .line 133
            aconst_null
            astore 2 /* pemParser */
        start local 2 // org.bouncycastle.openssl.PEMParser pemParser
         2: .line 135
            new org.bouncycastle.openssl.PEMParser
            dup
            new java.io.StringReader
            dup
            aload 0 /* key */
            invokespecial java.io.StringReader.<init>:(Ljava/lang/String;)V
            invokespecial org.bouncycastle.openssl.PEMParser.<init>:(Ljava/io/Reader;)V
            astore 2 /* pemParser */
         3: .line 136
            aload 2 /* pemParser */
            invokevirtual org.bouncycastle.openssl.PEMParser.readObject:()Ljava/lang/Object;
            astore 3 /* object */
        start local 3 // java.lang.Object object
         4: .line 137
            new org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter
            dup
            invokespecial org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter.<init>:()V
            ldc "BC"
            invokevirtual org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter.setProvider:(Ljava/lang/String;)Lorg/bouncycastle/openssl/jcajce/JcaPEMKeyConverter;
            astore 4 /* converter */
        start local 4 // org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter converter
         5: .line 139
            aload 3 /* object */
            instanceof org.bouncycastle.openssl.PEMEncryptedKeyPair
            ifeq 9
            aload 1 /* keyPass */
            ifnull 9
         6: .line 140
            new org.bouncycastle.openssl.jcajce.JcePEMDecryptorProviderBuilder
            dup
            invokespecial org.bouncycastle.openssl.jcajce.JcePEMDecryptorProviderBuilder.<init>:()V
            aload 1 /* keyPass */
            invokevirtual java.lang.String.toCharArray:()[C
            invokevirtual org.bouncycastle.openssl.jcajce.JcePEMDecryptorProviderBuilder.build:([C)Lorg/bouncycastle/openssl/PEMDecryptorProvider;
            astore 6 /* decProv */
        start local 6 // org.bouncycastle.openssl.PEMDecryptorProvider decProv
         7: .line 141
            aload 4 /* converter */
            aload 3 /* object */
            checkcast org.bouncycastle.openssl.PEMEncryptedKeyPair
            aload 6 /* decProv */
            invokevirtual org.bouncycastle.openssl.PEMEncryptedKeyPair.decryptKeyPair:(Lorg/bouncycastle/openssl/PEMDecryptorProvider;)Lorg/bouncycastle/openssl/PEMKeyPair;
            invokevirtual org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter.getKeyPair:(Lorg/bouncycastle/openssl/PEMKeyPair;)Ljava/security/KeyPair;
            astore 5 /* kp */
        end local 6 // org.bouncycastle.openssl.PEMDecryptorProvider decProv
        start local 5 // java.security.KeyPair kp
         8: .line 142
            goto 10
        end local 5 // java.security.KeyPair kp
         9: .line 143
      StackMap locals: org.bouncycastle.openssl.PEMParser java.lang.Object org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter
      StackMap stack:
            aload 4 /* converter */
            aload 3 /* object */
            checkcast org.bouncycastle.openssl.PEMKeyPair
            invokevirtual org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter.getKeyPair:(Lorg/bouncycastle/openssl/PEMKeyPair;)Ljava/security/KeyPair;
            astore 5 /* kp */
        start local 5 // java.security.KeyPair kp
        10: .line 145
      StackMap locals: java.security.KeyPair
      StackMap stack:
            aload 5 /* kp */
            invokevirtual java.security.KeyPair.getPrivate:()Ljava/security/PrivateKey;
            astore 8
        11: .line 147
            aload 2 /* pemParser */
            ifnull 13
        12: .line 148
            aload 2 /* pemParser */
            invokevirtual org.bouncycastle.openssl.PEMParser.close:()V
        13: .line 145
      StackMap locals: java.lang.String java.lang.String org.bouncycastle.openssl.PEMParser java.lang.Object org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter java.security.KeyPair top top java.security.PrivateKey
      StackMap stack:
            aload 8
            areturn
        end local 5 // java.security.KeyPair kp
        end local 4 // org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter converter
        end local 3 // java.lang.Object object
        14: .line 146
      StackMap locals: java.lang.String java.lang.String org.bouncycastle.openssl.PEMParser
      StackMap stack: java.lang.Throwable
            astore 7
        15: .line 147
            aload 2 /* pemParser */
            ifnull 17
        16: .line 148
            aload 2 /* pemParser */
            invokevirtual org.bouncycastle.openssl.PEMParser.close:()V
        17: .line 150
      StackMap locals: java.lang.String java.lang.String org.bouncycastle.openssl.PEMParser top top top top java.lang.Throwable
      StackMap stack:
            aload 7
            athrow
        end local 2 // org.bouncycastle.openssl.PEMParser pemParser
        end local 1 // java.lang.String keyPass
        end local 0 // java.lang.String key
      LocalVariableTable:
        Start  End  Slot       Name  Signature
            0   18     0        key  Ljava/lang/String;
            0   18     1    keyPass  Ljava/lang/String;
            2   18     2  pemParser  Lorg/bouncycastle/openssl/PEMParser;
            4   14     3     object  Ljava/lang/Object;
            5   14     4  converter  Lorg/bouncycastle/openssl/jcajce/JcaPEMKeyConverter;
            8    9     5         kp  Ljava/security/KeyPair;
           10   14     5         kp  Ljava/security/KeyPair;
            7    8     6    decProv  Lorg/bouncycastle/openssl/PEMDecryptorProvider;
      Exception table:
        from    to  target  type
           2    11      14  any
    Exceptions:
      throws java.io.IOException, java.security.NoSuchAlgorithmException, java.security.spec.InvalidKeySpecException
    MethodParameters:
         Name  Flags
      key      
      keyPass  

  private static java.security.PrivateKey loadPrivateKeyFromPVK(java.lang.String, java.lang.String);
    descriptor: (Ljava/lang/String;Ljava/lang/String;)Ljava/security/PrivateKey;
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=10, locals=26, args_size=2
        start local 0 // java.lang.String keyPath
        start local 1 // java.lang.String keyPass
         0: .line 155
            new java.io.File
            dup
            aload 0 /* keyPath */
            invokespecial java.io.File.<init>:(Ljava/lang/String;)V
            astore 2 /* f */
        start local 2 // java.io.File f
         1: .line 156
            aload 2 /* f */
            invokevirtual java.io.File.length:()J
            l2i
            invokestatic java.nio.ByteBuffer.allocate:(I)Ljava/nio/ByteBuffer;
            astore 3 /* buffer */
        start local 3 // java.nio.ByteBuffer buffer
         2: .line 157
            aconst_null
            astore 4
            aconst_null
            astore 5
         3: new java.io.FileInputStream
            dup
            aload 2 /* f */
            invokespecial java.io.FileInputStream.<init>:(Ljava/io/File;)V
            astore 6 /* in */
        start local 6 // java.io.FileInputStream in
         4: .line 158
            aload 6 /* in */
            invokevirtual java.io.FileInputStream.getChannel:()Ljava/nio/channels/FileChannel;
            aload 3 /* buffer */
            invokevirtual java.nio.channels.FileChannel.read:(Ljava/nio/ByteBuffer;)I
            pop
         5: .line 159
            aload 3 /* buffer */
            getstatic java.nio.ByteOrder.LITTLE_ENDIAN:Ljava/nio/ByteOrder;
            invokevirtual java.nio.ByteBuffer.order:(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;
            invokevirtual java.nio.Buffer.rewind:()Ljava/nio/Buffer;
            pop
         6: .line 161
            aload 3 /* buffer */
            invokevirtual java.nio.ByteBuffer.getInt:()I
            i2l
            ldc 4294967295
            land
            lstore 7 /* magic */
        start local 7 // long magic
         7: .line 162
            ldc 2964713758
            lload 7 /* magic */
            lcmp
            ifeq 11
         8: .line 163
            aconst_null
            lload 7 /* magic */
            invokestatic java.lang.Long.valueOf:(J)Ljava/lang/Long;
            ldc "R_pvkHeaderError"
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerResource.getResource:(Ljava/lang/String;)Ljava/lang/String;
         9: .line 164
            ldc ""
            iconst_0
        10: .line 163
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError:(Lcom/microsoft/sqlserver/jdbc/SQLServerConnection;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;Z)V
        11: .line 167
      StackMap locals: java.lang.String java.lang.String java.io.File java.nio.ByteBuffer java.lang.Throwable java.lang.Throwable java.io.FileInputStream long
      StackMap stack:
            aload 3 /* buffer */
            aload 3 /* buffer */
            invokevirtual java.nio.Buffer.position:()I
            bipush 8
            iadd
            invokevirtual java.nio.Buffer.position:(I)Ljava/nio/Buffer;
            pop
        12: .line 168
            aload 3 /* buffer */
            invokevirtual java.nio.ByteBuffer.getInt:()I
            ifeq 13
            iconst_1
            goto 14
      StackMap locals:
      StackMap stack:
        13: iconst_0
      StackMap locals:
      StackMap stack: int
        14: istore 9 /* encrypted */
        start local 9 // boolean encrypted
        15: .line 169
            aload 3 /* buffer */
            invokevirtual java.nio.ByteBuffer.getInt:()I
            istore 10 /* saltLength */
        start local 10 // int saltLength
        16: .line 170
            aload 3 /* buffer */
            invokevirtual java.nio.ByteBuffer.getInt:()I
            istore 11 /* keyLength */
        start local 11 // int keyLength
        17: .line 171
            iload 10 /* saltLength */
            newarray 8
            astore 12 /* salt */
        start local 12 // byte[] salt
        18: .line 172
            aload 3 /* buffer */
            aload 12 /* salt */
            invokevirtual java.nio.ByteBuffer.get:([B)Ljava/nio/ByteBuffer;
            pop
        19: .line 174
            aload 3 /* buffer */
            aload 3 /* buffer */
            invokevirtual java.nio.Buffer.position:()I
            bipush 8
            iadd
            invokevirtual java.nio.Buffer.position:(I)Ljava/nio/Buffer;
            pop
        20: .line 177
            iload 11 /* keyLength */
            bipush 8
            isub
            newarray 8
            astore 13 /* key */
        start local 13 // byte[] key
        21: .line 178
            aload 3 /* buffer */
            aload 13 /* key */
            invokevirtual java.nio.ByteBuffer.get:([B)Ljava/nio/ByteBuffer;
            pop
        22: .line 180
            iload 9 /* encrypted */
            ifeq 29
        23: .line 181
            ldc "SHA1"
            invokestatic java.security.MessageDigest.getInstance:(Ljava/lang/String;)Ljava/security/MessageDigest;
            astore 14 /* digest */
        start local 14 // java.security.MessageDigest digest
        24: .line 182
            aload 14 /* digest */
            aload 12 /* salt */
            invokevirtual java.security.MessageDigest.update:([B)V
        25: .line 183
            aload 1 /* keyPass */
            ifnull 27
        26: .line 184
            aload 14 /* digest */
            aload 1 /* keyPass */
            invokevirtual java.lang.String.getBytes:()[B
            invokevirtual java.security.MessageDigest.update:([B)V
        27: .line 186
      StackMap locals: java.lang.String java.lang.String java.io.File java.nio.ByteBuffer java.lang.Throwable java.lang.Throwable java.io.FileInputStream long int int int byte[] byte[] java.security.MessageDigest
      StackMap stack:
            aload 14 /* digest */
            invokevirtual java.security.MessageDigest.digest:()[B
            astore 15 /* hash */
        start local 15 // byte[] hash
        28: .line 187
            aload 13 /* key */
            aload 15 /* hash */
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.getSecretKeyFromHash:([B[B)[B
            astore 13 /* key */
        end local 15 // byte[] hash
        end local 14 // java.security.MessageDigest digest
        29: .line 190
      StackMap locals:
      StackMap stack:
            aload 13 /* key */
            invokestatic java.nio.ByteBuffer.wrap:([B)Ljava/nio/ByteBuffer;
            getstatic java.nio.ByteOrder.LITTLE_ENDIAN:Ljava/nio/ByteOrder;
            invokevirtual java.nio.ByteBuffer.order:(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;
            astore 14 /* buff */
        start local 14 // java.nio.ByteBuffer buff
        30: .line 191
            aload 14 /* buff */
            getstatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.RSA2_MAGIC:[B
            arraylength
            invokevirtual java.nio.Buffer.position:(I)Ljava/nio/Buffer;
            pop
        31: .line 193
            aload 14 /* buff */
            invokevirtual java.nio.ByteBuffer.getInt:()I
            bipush 8
            idiv
            istore 15 /* byteLength */
        start local 15 // int byteLength
        32: .line 194
            aload 14 /* buff */
            invokevirtual java.nio.ByteBuffer.getInt:()I
            i2l
            invokestatic java.math.BigInteger.valueOf:(J)Ljava/math/BigInteger;
            astore 16 /* publicExponent */
        start local 16 // java.math.BigInteger publicExponent
        33: .line 195
            aload 14 /* buff */
            iload 15 /* byteLength */
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.getBigInteger:(Ljava/nio/ByteBuffer;I)Ljava/math/BigInteger;
            astore 17 /* modulus */
        start local 17 // java.math.BigInteger modulus
        34: .line 196
            aload 14 /* buff */
            iload 15 /* byteLength */
            iconst_2
            idiv
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.getBigInteger:(Ljava/nio/ByteBuffer;I)Ljava/math/BigInteger;
            astore 18 /* prime1 */
        start local 18 // java.math.BigInteger prime1
        35: .line 197
            aload 14 /* buff */
            iload 15 /* byteLength */
            iconst_2
            idiv
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.getBigInteger:(Ljava/nio/ByteBuffer;I)Ljava/math/BigInteger;
            astore 19 /* prime2 */
        start local 19 // java.math.BigInteger prime2
        36: .line 198
            aload 14 /* buff */
            iload 15 /* byteLength */
            iconst_2
            idiv
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.getBigInteger:(Ljava/nio/ByteBuffer;I)Ljava/math/BigInteger;
            astore 20 /* primeExponent1 */
        start local 20 // java.math.BigInteger primeExponent1
        37: .line 199
            aload 14 /* buff */
            iload 15 /* byteLength */
            iconst_2
            idiv
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.getBigInteger:(Ljava/nio/ByteBuffer;I)Ljava/math/BigInteger;
            astore 21 /* primeExponent2 */
        start local 21 // java.math.BigInteger primeExponent2
        38: .line 200
            aload 14 /* buff */
            iload 15 /* byteLength */
            iconst_2
            idiv
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.getBigInteger:(Ljava/nio/ByteBuffer;I)Ljava/math/BigInteger;
            astore 22 /* crtCoefficient */
        start local 22 // java.math.BigInteger crtCoefficient
        39: .line 201
            aload 14 /* buff */
            iload 15 /* byteLength */
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.getBigInteger:(Ljava/nio/ByteBuffer;I)Ljava/math/BigInteger;
            astore 23 /* privateExponent */
        start local 23 // java.math.BigInteger privateExponent
        40: .line 203
            new java.security.spec.RSAPrivateCrtKeySpec
            dup
            aload 17 /* modulus */
            aload 16 /* publicExponent */
            aload 23 /* privateExponent */
            aload 18 /* prime1 */
        41: .line 204
            aload 19 /* prime2 */
            aload 20 /* primeExponent1 */
            aload 21 /* primeExponent2 */
            aload 22 /* crtCoefficient */
        42: .line 203
            invokespecial java.security.spec.RSAPrivateCrtKeySpec.<init>:(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V
            astore 24 /* spec */
        start local 24 // java.security.spec.RSAPrivateCrtKeySpec spec
        43: .line 205
            ldc "RSA"
            invokestatic java.security.KeyFactory.getInstance:(Ljava/lang/String;)Ljava/security/KeyFactory;
            astore 25 /* factory */
        start local 25 // java.security.KeyFactory factory
        44: .line 206
            aload 25 /* factory */
            aload 24 /* spec */
            invokevirtual java.security.KeyFactory.generatePrivate:(Ljava/security/spec/KeySpec;)Ljava/security/PrivateKey;
        45: .line 207
            aload 6 /* in */
            ifnull 46
            aload 6 /* in */
            invokevirtual java.io.FileInputStream.close:()V
        46: .line 206
      StackMap locals: java.lang.String java.lang.String java.io.File java.nio.ByteBuffer java.lang.Throwable java.lang.Throwable java.io.FileInputStream long int int int byte[] byte[] java.nio.ByteBuffer int java.math.BigInteger java.math.BigInteger java.math.BigInteger java.math.BigInteger java.math.BigInteger java.math.BigInteger java.math.BigInteger java.math.BigInteger java.security.spec.RSAPrivateCrtKeySpec java.security.KeyFactory
      StackMap stack: java.security.PrivateKey
            areturn
        end local 25 // java.security.KeyFactory factory
        end local 24 // java.security.spec.RSAPrivateCrtKeySpec spec
        end local 23 // java.math.BigInteger privateExponent
        end local 22 // java.math.BigInteger crtCoefficient
        end local 21 // java.math.BigInteger primeExponent2
        end local 20 // java.math.BigInteger primeExponent1
        end local 19 // java.math.BigInteger prime2
        end local 18 // java.math.BigInteger prime1
        end local 17 // java.math.BigInteger modulus
        end local 16 // java.math.BigInteger publicExponent
        end local 15 // int byteLength
        end local 14 // java.nio.ByteBuffer buff
        end local 13 // byte[] key
        end local 12 // byte[] salt
        end local 11 // int keyLength
        end local 10 // int saltLength
        end local 9 // boolean encrypted
        end local 7 // long magic
      StackMap locals: java.lang.String java.lang.String java.io.File java.nio.ByteBuffer java.lang.Throwable java.lang.Throwable java.io.FileInputStream
      StackMap stack: java.lang.Throwable
        47: astore 4
        48: .line 207
            aload 6 /* in */
            ifnull 49
            aload 6 /* in */
            invokevirtual java.io.FileInputStream.close:()V
        end local 6 // java.io.FileInputStream in
      StackMap locals:
      StackMap stack:
        49: aload 4
            athrow
      StackMap locals:
      StackMap stack: java.lang.Throwable
        50: astore 5
            aload 4
            ifnonnull 51
            aload 5
            astore 4
            goto 52
      StackMap locals:
      StackMap stack:
        51: aload 4
            aload 5
            if_acmpeq 52
            aload 4
            aload 5
            invokevirtual java.lang.Throwable.addSuppressed:(Ljava/lang/Throwable;)V
      StackMap locals:
      StackMap stack:
        52: aload 4
            athrow
        end local 3 // java.nio.ByteBuffer buffer
        end local 2 // java.io.File f
        end local 1 // java.lang.String keyPass
        end local 0 // java.lang.String keyPath
      LocalVariableTable:
        Start  End  Slot             Name  Signature
            0   53     0          keyPath  Ljava/lang/String;
            0   53     1          keyPass  Ljava/lang/String;
            1   53     2                f  Ljava/io/File;
            2   53     3           buffer  Ljava/nio/ByteBuffer;
            4   49     6               in  Ljava/io/FileInputStream;
            7   47     7            magic  J
           15   47     9        encrypted  Z
           16   47    10       saltLength  I
           17   47    11        keyLength  I
           18   47    12             salt  [B
           21   47    13              key  [B
           24   29    14           digest  Ljava/security/MessageDigest;
           28   29    15             hash  [B
           30   47    14             buff  Ljava/nio/ByteBuffer;
           32   47    15       byteLength  I
           33   47    16   publicExponent  Ljava/math/BigInteger;
           34   47    17          modulus  Ljava/math/BigInteger;
           35   47    18           prime1  Ljava/math/BigInteger;
           36   47    19           prime2  Ljava/math/BigInteger;
           37   47    20   primeExponent1  Ljava/math/BigInteger;
           38   47    21   primeExponent2  Ljava/math/BigInteger;
           39   47    22   crtCoefficient  Ljava/math/BigInteger;
           40   47    23  privateExponent  Ljava/math/BigInteger;
           43   47    24             spec  Ljava/security/spec/RSAPrivateCrtKeySpec;
           44   47    25          factory  Ljava/security/KeyFactory;
      Exception table:
        from    to  target  type
           4    45      47  any
           3    46      50  any
          47    50      50  any
    Exceptions:
      throws java.io.IOException, java.security.GeneralSecurityException, com.microsoft.sqlserver.jdbc.SQLServerException
    MethodParameters:
         Name  Flags
      keyPath  
      keyPass  

  private static java.security.cert.Certificate loadCertificate(java.lang.String);
    descriptor: (Ljava/lang/String;)Ljava/security/cert/Certificate;
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=2, locals=5, args_size=1
        start local 0 // java.lang.String certificatePem
         0: .line 212
            ldc "X509"
            invokestatic java.security.cert.CertificateFactory.getInstance:(Ljava/lang/String;)Ljava/security/cert/CertificateFactory;
            astore 1 /* certificateFactory */
        start local 1 // java.security.cert.CertificateFactory certificateFactory
         1: .line 213
            aconst_null
            astore 2
            aconst_null
            astore 3
         2: aload 0 /* certificatePem */
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.fileToStream:(Ljava/lang/String;)Ljava/io/InputStream;
            astore 4 /* certStream */
        start local 4 // java.io.InputStream certStream
         3: .line 214
            aload 1 /* certificateFactory */
            aload 4 /* certStream */
            invokevirtual java.security.cert.CertificateFactory.generateCertificate:(Ljava/io/InputStream;)Ljava/security/cert/Certificate;
         4: .line 215
            aload 4 /* certStream */
            ifnull 5
            aload 4 /* certStream */
            invokevirtual java.io.InputStream.close:()V
         5: .line 214
      StackMap locals: java.lang.String java.security.cert.CertificateFactory java.lang.Throwable java.lang.Throwable java.io.InputStream
      StackMap stack: java.security.cert.Certificate
            areturn
      StackMap locals:
      StackMap stack: java.lang.Throwable
         6: astore 2
         7: .line 215
            aload 4 /* certStream */
            ifnull 8
            aload 4 /* certStream */
            invokevirtual java.io.InputStream.close:()V
        end local 4 // java.io.InputStream certStream
      StackMap locals:
      StackMap stack:
         8: aload 2
            athrow
      StackMap locals:
      StackMap stack: java.lang.Throwable
         9: astore 3
            aload 2
            ifnonnull 10
            aload 3
            astore 2
            goto 11
      StackMap locals:
      StackMap stack:
        10: aload 2
            aload 3
            if_acmpeq 11
            aload 2
            aload 3
            invokevirtual java.lang.Throwable.addSuppressed:(Ljava/lang/Throwable;)V
      StackMap locals:
      StackMap stack:
        11: aload 2
            athrow
        end local 1 // java.security.cert.CertificateFactory certificateFactory
        end local 0 // java.lang.String certificatePem
      LocalVariableTable:
        Start  End  Slot                Name  Signature
            0   12     0      certificatePem  Ljava/lang/String;
            1   12     1  certificateFactory  Ljava/security/cert/CertificateFactory;
            3    8     4          certStream  Ljava/io/InputStream;
      Exception table:
        from    to  target  type
           3     4       6  any
           2     5       9  any
           6     9       9  any
    Exceptions:
      throws java.io.IOException, java.security.GeneralSecurityException, com.microsoft.sqlserver.jdbc.SQLServerException
    MethodParameters:
                Name  Flags
      certificatePem  

  private static java.security.PrivateKey loadPrivateKey(java.lang.String, java.lang.String);
    descriptor: (Ljava/lang/String;Ljava/lang/String;)Ljava/security/PrivateKey;
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=2, locals=3, args_size=2
        start local 0 // java.lang.String privateKeyPemPath
        start local 1 // java.lang.String privateKeyPassword
         0: .line 220
            aload 0 /* privateKeyPemPath */
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.getStringFromFile:(Ljava/lang/String;)Ljava/lang/String;
            astore 2 /* privateKeyPem */
        start local 2 // java.lang.String privateKeyPem
         1: .line 222
            aload 2 /* privateKeyPem */
            ldc "-----BEGIN PRIVATE KEY-----"
            invokevirtual java.lang.String.contains:(Ljava/lang/CharSequence;)Z
            ifeq 3
         2: .line 223
            aload 2 /* privateKeyPem */
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.loadPrivateKeyFromPKCS8:(Ljava/lang/String;)Ljava/security/PrivateKey;
            areturn
         3: .line 224
      StackMap locals: java.lang.String
      StackMap stack:
            aload 2 /* privateKeyPem */
            ldc "-----BEGIN RSA PRIVATE KEY-----"
            invokevirtual java.lang.String.contains:(Ljava/lang/CharSequence;)Z
            ifeq 5
         4: .line 225
            aload 2 /* privateKeyPem */
            aload 1 /* privateKeyPassword */
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.loadPrivateKeyFromPKCS1:(Ljava/lang/String;Ljava/lang/String;)Ljava/security/PrivateKey;
            areturn
         5: .line 227
      StackMap locals:
      StackMap stack:
            aload 0 /* privateKeyPemPath */
            aload 1 /* privateKeyPassword */
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.loadPrivateKeyFromPVK:(Ljava/lang/String;Ljava/lang/String;)Ljava/security/PrivateKey;
            areturn
        end local 2 // java.lang.String privateKeyPem
        end local 1 // java.lang.String privateKeyPassword
        end local 0 // java.lang.String privateKeyPemPath
      LocalVariableTable:
        Start  End  Slot                Name  Signature
            0    6     0   privateKeyPemPath  Ljava/lang/String;
            0    6     1  privateKeyPassword  Ljava/lang/String;
            1    6     2       privateKeyPem  Ljava/lang/String;
    Exceptions:
      throws java.security.GeneralSecurityException, java.io.IOException, com.microsoft.sqlserver.jdbc.SQLServerException
    MethodParameters:
                    Name  Flags
      privateKeyPemPath   
      privateKeyPassword  

  private static boolean startsWithMagic(byte[]);
    descriptor: ([B)Z
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=3, locals=2, args_size=1
        start local 0 // byte[] b
         0: .line 232
            iconst_0
            istore 1 /* i */
        start local 1 // int i
         1: goto 5
         2: .line 233
      StackMap locals: int
      StackMap stack:
            aload 0 /* b */
            iload 1 /* i */
            baload
            getstatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.RSA2_MAGIC:[B
            iload 1 /* i */
            baload
            if_icmpeq 4
         3: .line 234
            iconst_0
            ireturn
         4: .line 232
      StackMap locals:
      StackMap stack:
            iinc 1 /* i */ 1
      StackMap locals:
      StackMap stack:
         5: iload 1 /* i */
            getstatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.RSA2_MAGIC:[B
            arraylength
            if_icmplt 2
        end local 1 // int i
         6: .line 236
            iconst_1
            ireturn
        end local 0 // byte[] b
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    7     0     b  [B
            1    6     1     i  I
    MethodParameters:
      Name  Flags
      b     

  private static byte[] getSecretKeyFromHash(byte[], byte[]);
    descriptor: ([B[B)[B
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=6, locals=4, args_size=2
        start local 0 // byte[] originalKey
        start local 1 // byte[] keyHash
         0: .line 241
            new javax.crypto.spec.SecretKeySpec
            dup
            aload 1 /* keyHash */
            iconst_0
            bipush 16
            ldc "RC4"
            invokespecial javax.crypto.spec.SecretKeySpec.<init>:([BIILjava/lang/String;)V
            astore 2 /* key */
        start local 2 // javax.crypto.SecretKey key
         1: .line 242
            aload 2 /* key */
            aload 0 /* originalKey */
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.decryptSecretKey:(Ljavax/crypto/SecretKey;[B)[B
            astore 3 /* decrypted */
        start local 3 // byte[] decrypted
         2: .line 243
            aload 3 /* decrypted */
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.startsWithMagic:([B)Z
            ifeq 4
         3: .line 244
            aload 3 /* decrypted */
            areturn
         4: .line 248
      StackMap locals: javax.crypto.SecretKey byte[]
      StackMap stack:
            aload 1 /* keyHash */
            iconst_5
            aload 1 /* keyHash */
            arraylength
            iconst_0
            invokestatic java.util.Arrays.fill:([BIIB)V
         5: .line 249
            new javax.crypto.spec.SecretKeySpec
            dup
            aload 1 /* keyHash */
            iconst_0
            bipush 16
            ldc "RC4"
            invokespecial javax.crypto.spec.SecretKeySpec.<init>:([BIILjava/lang/String;)V
            astore 2 /* key */
         6: .line 250
            aload 2 /* key */
            aload 0 /* originalKey */
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.decryptSecretKey:(Ljavax/crypto/SecretKey;[B)[B
            astore 3 /* decrypted */
         7: .line 251
            aload 3 /* decrypted */
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerCertificateUtils.startsWithMagic:([B)Z
            ifeq 9
         8: .line 252
            aload 3 /* decrypted */
            areturn
         9: .line 255
      StackMap locals:
      StackMap stack:
            aconst_null
            aload 0 /* originalKey */
            ldc "R_pvkParseError"
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerResource.getResource:(Ljava/lang/String;)Ljava/lang/String;
            ldc ""
        10: .line 256
            iconst_0
        11: .line 255
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError:(Lcom/microsoft/sqlserver/jdbc/SQLServerConnection;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;Z)V
        12: .line 257
            aconst_null
            areturn
        end local 3 // byte[] decrypted
        end local 2 // javax.crypto.SecretKey key
        end local 1 // byte[] keyHash
        end local 0 // byte[] originalKey
      LocalVariableTable:
        Start  End  Slot         Name  Signature
            0   13     0  originalKey  [B
            0   13     1      keyHash  [B
            1   13     2          key  Ljavax/crypto/SecretKey;
            2   13     3    decrypted  [B
    Exceptions:
      throws java.security.GeneralSecurityException, com.microsoft.sqlserver.jdbc.SQLServerException
    MethodParameters:
             Name  Flags
      originalKey  
      keyHash      

  private static byte[] decryptSecretKey(javax.crypto.SecretKey, byte[]);
    descriptor: (Ljavax/crypto/SecretKey;[B)[B
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=3, locals=3, args_size=2
        start local 0 // javax.crypto.SecretKey key
        start local 1 // byte[] encoded
         0: .line 261
            aload 0 /* key */
            invokeinterface javax.crypto.SecretKey.getAlgorithm:()Ljava/lang/String;
            invokestatic javax.crypto.Cipher.getInstance:(Ljava/lang/String;)Ljavax/crypto/Cipher;
            astore 2 /* cipher */
        start local 2 // javax.crypto.Cipher cipher
         1: .line 262
            aload 2 /* cipher */
            iconst_2
            aload 0 /* key */
            invokevirtual javax.crypto.Cipher.init:(ILjava/security/Key;)V
         2: .line 263
            aload 2 /* cipher */
            aload 1 /* encoded */
            invokevirtual javax.crypto.Cipher.doFinal:([B)[B
            areturn
        end local 2 // javax.crypto.Cipher cipher
        end local 1 // byte[] encoded
        end local 0 // javax.crypto.SecretKey key
      LocalVariableTable:
        Start  End  Slot     Name  Signature
            0    3     0      key  Ljavax/crypto/SecretKey;
            0    3     1  encoded  [B
            1    3     2   cipher  Ljavax/crypto/Cipher;
    Exceptions:
      throws java.security.GeneralSecurityException
    MethodParameters:
         Name  Flags
      key      
      encoded  

  private static java.math.BigInteger getBigInteger(java.nio.ByteBuffer, int);
    descriptor: (Ljava/nio/ByteBuffer;I)Ljava/math/BigInteger;
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=3, locals=4, args_size=2
        start local 0 // java.nio.ByteBuffer buffer
        start local 1 // int length
         0: .line 268
            iload 1 /* length */
            iconst_1
            iadd
            newarray 8
            astore 2 /* array */
        start local 2 // byte[] array
         1: .line 270
            iconst_0
            istore 3 /* i */
        start local 3 // int i
         2: goto 5
         3: .line 271
      StackMap locals: byte[] int
      StackMap stack:
            aload 2 /* array */
            aload 2 /* array */
            arraylength
            iconst_1
            isub
            iload 3 /* i */
            isub
            aload 0 /* buffer */
            invokevirtual java.nio.ByteBuffer.get:()B
            bastore
         4: .line 270
            iinc 3 /* i */ 1
      StackMap locals:
      StackMap stack:
         5: iload 3 /* i */
            iload 1 /* length */
            if_icmplt 3
        end local 3 // int i
         6: .line 273
            new java.math.BigInteger
            dup
            aload 2 /* array */
            invokespecial java.math.BigInteger.<init>:([B)V
            areturn
        end local 2 // byte[] array
        end local 1 // int length
        end local 0 // java.nio.ByteBuffer buffer
      LocalVariableTable:
        Start  End  Slot    Name  Signature
            0    7     0  buffer  Ljava/nio/ByteBuffer;
            0    7     1  length  I
            1    7     2   array  [B
            2    6     3       i  I
    MethodParameters:
        Name  Flags
      buffer  
      length  

  private static java.io.InputStream fileToStream(java.lang.String);
    descriptor: (Ljava/lang/String;)Ljava/io/InputStream;
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=6, locals=6, args_size=1
        start local 0 // java.lang.String fname
         0: .line 277
            aconst_null
            astore 1
            aconst_null
            astore 2
         1: new java.io.FileInputStream
            dup
            aload 0 /* fname */
            invokespecial java.io.FileInputStream.<init>:(Ljava/lang/String;)V
            astore 3 /* fis */
        start local 3 // java.io.FileInputStream fis
         2: new java.io.DataInputStream
            dup
            aload 3 /* fis */
            invokespecial java.io.DataInputStream.<init>:(Ljava/io/InputStream;)V
            astore 4 /* dis */
        start local 4 // java.io.DataInputStream dis
         3: .line 278
            aload 4 /* dis */
            invokevirtual java.io.DataInputStream.available:()I
            newarray 8
            astore 5 /* bytes */
        start local 5 // byte[] bytes
         4: .line 279
            aload 4 /* dis */
            aload 5 /* bytes */
            invokevirtual java.io.DataInputStream.readFully:([B)V
         5: .line 280
            new java.io.ByteArrayInputStream
            dup
            aload 5 /* bytes */
            invokespecial java.io.ByteArrayInputStream.<init>:([B)V
         6: .line 281
            aload 4 /* dis */
            ifnull 7
            aload 4 /* dis */
            invokevirtual java.io.DataInputStream.close:()V
      StackMap locals: java.lang.String java.lang.Throwable java.lang.Throwable java.io.FileInputStream java.io.DataInputStream byte[]
      StackMap stack: java.io.ByteArrayInputStream
         7: aload 3 /* fis */
            ifnull 8
            aload 3 /* fis */
            invokevirtual java.io.FileInputStream.close:()V
         8: .line 280
      StackMap locals:
      StackMap stack: java.io.ByteArrayInputStream
            areturn
        end local 5 // byte[] bytes
      StackMap locals: java.lang.String java.lang.Throwable java.lang.Throwable java.io.FileInputStream java.io.DataInputStream
      StackMap stack: java.lang.Throwable
         9: astore 1
        10: .line 281
            aload 4 /* dis */
            ifnull 11
            aload 4 /* dis */
            invokevirtual java.io.DataInputStream.close:()V
        end local 4 // java.io.DataInputStream dis
      StackMap locals:
      StackMap stack:
        11: aload 1
            athrow
      StackMap locals:
      StackMap stack: java.lang.Throwable
        12: astore 2
            aload 1
            ifnonnull 13
            aload 2
            astore 1
            goto 14
      StackMap locals:
      StackMap stack:
        13: aload 1
            aload 2
            if_acmpeq 14
            aload 1
            aload 2
            invokevirtual java.lang.Throwable.addSuppressed:(Ljava/lang/Throwable;)V
      StackMap locals:
      StackMap stack:
        14: aload 3 /* fis */
            ifnull 15
            aload 3 /* fis */
            invokevirtual java.io.FileInputStream.close:()V
        end local 3 // java.io.FileInputStream fis
      StackMap locals:
      StackMap stack:
        15: aload 1
            athrow
      StackMap locals:
      StackMap stack: java.lang.Throwable
        16: astore 2
            aload 1
            ifnonnull 17
            aload 2
            astore 1
            goto 18
      StackMap locals:
      StackMap stack:
        17: aload 1
            aload 2
            if_acmpeq 18
            aload 1
            aload 2
            invokevirtual java.lang.Throwable.addSuppressed:(Ljava/lang/Throwable;)V
      StackMap locals:
      StackMap stack:
        18: aload 1
            athrow
      StackMap locals: java.lang.String
      StackMap stack: java.io.FileNotFoundException
        19: pop
        20: .line 282
            new com.microsoft.sqlserver.jdbc.SQLServerException
            dup
            ldc "R_clientCertError"
            invokestatic com.microsoft.sqlserver.jdbc.SQLServerException.getErrString:(Ljava/lang/String;)Ljava/lang/String;
            aconst_null
            iconst_0
            aconst_null
            invokespecial com.microsoft.sqlserver.jdbc.SQLServerException.<init>:(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V
            athrow
        end local 0 // java.lang.String fname
      LocalVariableTable:
        Start  End  Slot   Name  Signature
            0   21     0  fname  Ljava/lang/String;
            2   15     3    fis  Ljava/io/FileInputStream;
            3   11     4    dis  Ljava/io/DataInputStream;
            4    9     5  bytes  [B
      Exception table:
        from    to  target  type
           3     6       9  any
           2     7      12  any
           9    12      12  any
           1     8      16  any
           9    16      16  any
           0     8      19  Class java.io.FileNotFoundException
           9    19      19  Class java.io.FileNotFoundException
    Exceptions:
      throws java.io.IOException, com.microsoft.sqlserver.jdbc.SQLServerException
    MethodParameters:
       Name  Flags
      fname  

  private static java.lang.String getStringFromFile(java.lang.String);
    descriptor: (Ljava/lang/String;)Ljava/lang/String;
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=4, locals=1, args_size=1
        start local 0 // java.lang.String filePath
         0: .line 287
            new java.lang.String
            dup
            aload 0 /* filePath */
            iconst_0
            anewarray java.lang.String
            invokestatic java.nio.file.Paths.get:(Ljava/lang/String;[Ljava/lang/String;)Ljava/nio/file/Path;
            invokestatic java.nio.file.Files.readAllBytes:(Ljava/nio/file/Path;)[B
            invokespecial java.lang.String.<init>:([B)V
            areturn
        end local 0 // java.lang.String filePath
      LocalVariableTable:
        Start  End  Slot      Name  Signature
            0    1     0  filePath  Ljava/lang/String;
    Exceptions:
      throws java.io.IOException
    MethodParameters:
          Name  Flags
      filePath  
}
SourceFile: "SQLServerCertificateUtils.java"
InnerClasses:
  public Decoder = java.util.Base64$Decoder of java.util.Base64