public class org.postgresql.util.MD5Digest
  minor version: 0
  major version: 59
  flags: flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: org.postgresql.util.MD5Digest
  super_class: java.lang.Object
{
  private void <init>();
    descriptor: ()V
    flags: (0x0002) ACC_PRIVATE
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // org.postgresql.util.MD5Digest this
         0: .line 17
            aload 0 /* this */
            invokespecial java.lang.Object.<init>:()V
         1: .line 18
            return
        end local 0 // org.postgresql.util.MD5Digest this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    2     0  this  Lorg/postgresql/util/MD5Digest;

  public static byte[] encode(byte[], byte[], byte[]);
    descriptor: ([B[B[B)[B
    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
    Code:
      stack=4, locals=8, args_size=3
        start local 0 // byte[] user
        start local 1 // byte[] password
        start local 2 // byte[] salt
         0: .line 32
            bipush 35
            newarray 8
            astore 6 /* hexDigest */
        start local 6 // byte[] hexDigest
         1: .line 35
            ldc "MD5"
            invokestatic java.security.MessageDigest.getInstance:(Ljava/lang/String;)Ljava/security/MessageDigest;
            astore 3 /* md */
        start local 3 // java.security.MessageDigest md
         2: .line 37
            aload 3 /* md */
            aload 1 /* password */
            invokevirtual java.security.MessageDigest.update:([B)V
         3: .line 38
            aload 3 /* md */
            aload 0 /* user */
            invokevirtual java.security.MessageDigest.update:([B)V
         4: .line 39
            aload 3 /* md */
            invokevirtual java.security.MessageDigest.digest:()[B
            astore 4 /* tempDigest */
        start local 4 // byte[] tempDigest
         5: .line 41
            aload 4 /* tempDigest */
            aload 6 /* hexDigest */
            iconst_0
            invokestatic org.postgresql.util.MD5Digest.bytesToHex:([B[BI)V
         6: .line 42
            aload 3 /* md */
            aload 6 /* hexDigest */
            iconst_0
            bipush 32
            invokevirtual java.security.MessageDigest.update:([BII)V
         7: .line 43
            aload 3 /* md */
            aload 2 /* salt */
            invokevirtual java.security.MessageDigest.update:([B)V
         8: .line 44
            aload 3 /* md */
            invokevirtual java.security.MessageDigest.digest:()[B
            astore 5 /* passDigest */
        start local 5 // byte[] passDigest
         9: .line 46
            aload 5 /* passDigest */
            aload 6 /* hexDigest */
            iconst_3
            invokestatic org.postgresql.util.MD5Digest.bytesToHex:([B[BI)V
        10: .line 47
            aload 6 /* hexDigest */
            iconst_0
            bipush 109
            bastore
        11: .line 48
            aload 6 /* hexDigest */
            iconst_1
            bipush 100
            bastore
        12: .line 49
            aload 6 /* hexDigest */
            iconst_2
            bipush 53
            bastore
        13: .line 50
            goto 16
        end local 5 // byte[] passDigest
        end local 4 // byte[] tempDigest
        end local 3 // java.security.MessageDigest md
      StackMap locals: byte[] byte[] byte[] top top top byte[]
      StackMap stack: java.security.NoSuchAlgorithmException
        14: astore 7 /* e */
        start local 7 // java.security.NoSuchAlgorithmException e
        15: .line 51
            new java.lang.IllegalStateException
            dup
            ldc "Unable to encode password with MD5"
            aload 7 /* e */
            invokespecial java.lang.IllegalStateException.<init>:(Ljava/lang/String;Ljava/lang/Throwable;)V
            athrow
        end local 7 // java.security.NoSuchAlgorithmException e
        start local 3 // java.security.MessageDigest md
        start local 4 // byte[] tempDigest
        start local 5 // byte[] passDigest
        16: .line 54
      StackMap locals: byte[] byte[] byte[] java.security.MessageDigest byte[] byte[] byte[]
      StackMap stack:
            aload 6 /* hexDigest */
            areturn
        end local 6 // byte[] hexDigest
        end local 5 // byte[] passDigest
        end local 4 // byte[] tempDigest
        end local 3 // java.security.MessageDigest md
        end local 2 // byte[] salt
        end local 1 // byte[] password
        end local 0 // byte[] user
      LocalVariableTable:
        Start  End  Slot        Name  Signature
            0   17     0        user  [B
            0   17     1    password  [B
            0   17     2        salt  [B
            2   14     3          md  Ljava/security/MessageDigest;
           16   17     3          md  Ljava/security/MessageDigest;
            5   14     4  tempDigest  [B
           16   17     4  tempDigest  [B
            9   14     5  passDigest  [B
           16   17     5  passDigest  [B
            1   17     6   hexDigest  [B
           15   16     7           e  Ljava/security/NoSuchAlgorithmException;
      Exception table:
        from    to  target  type
           1    13      14  Class java.security.NoSuchAlgorithmException
    MethodParameters:
          Name  Flags
      user      
      password  
      salt      

  private static void bytesToHex(byte[], byte[], int);
    descriptor: ([B[BI)V
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=4, locals=8, args_size=3
        start local 0 // byte[] bytes
        start local 1 // byte[] hex
        start local 2 // int offset
         0: .line 62
            bipush 16
            newarray 5
            dup
            iconst_0
            bipush 48
            castore
            dup
            iconst_1
            bipush 49
            castore
            dup
            iconst_2
            bipush 50
            castore
            dup
            iconst_3
            bipush 51
            castore
            dup
            iconst_4
            bipush 52
            castore
            dup
            iconst_5
            bipush 53
            castore
            dup
            bipush 6
            bipush 54
            castore
            dup
            bipush 7
            bipush 55
            castore
            dup
            bipush 8
            bipush 56
            castore
            dup
            bipush 9
            bipush 57
            castore
            dup
            bipush 10
            bipush 97
            castore
            dup
            bipush 11
            bipush 98
            castore
            dup
            bipush 12
            bipush 99
            castore
            dup
            bipush 13
            bipush 100
            castore
            dup
            bipush 14
            bipush 101
            castore
            dup
            bipush 15
            bipush 102
            castore
         1: .line 61
            astore 3 /* lookup */
        start local 3 // char[] lookup
         2: .line 67
            iload 2 /* offset */
            istore 7 /* pos */
        start local 7 // int pos
         3: .line 69
            iconst_0
            istore 4 /* i */
        start local 4 // int i
         4: goto 11
         5: .line 70
      StackMap locals: byte[] byte[] int char[] int top top int
      StackMap stack:
            aload 0 /* bytes */
            iload 4 /* i */
            baload
            sipush 255
            iand
            istore 5 /* c */
        start local 5 // int c
         6: .line 71
            iload 5 /* c */
            iconst_4
            ishr
            istore 6 /* j */
        start local 6 // int j
         7: .line 72
            aload 1 /* hex */
            iload 7 /* pos */
            iinc 7 /* pos */ 1
            aload 3 /* lookup */
            iload 6 /* j */
            caload
            i2b
            bastore
         8: .line 73
            iload 5 /* c */
            bipush 15
            iand
            istore 6 /* j */
         9: .line 74
            aload 1 /* hex */
            iload 7 /* pos */
            iinc 7 /* pos */ 1
            aload 3 /* lookup */
            iload 6 /* j */
            caload
            i2b
            bastore
        10: .line 69
            iinc 4 /* i */ 1
        end local 6 // int j
        end local 5 // int c
      StackMap locals:
      StackMap stack:
        11: iload 4 /* i */
            bipush 16
            if_icmplt 5
        12: .line 76
            return
        end local 7 // int pos
        end local 4 // int i
        end local 3 // char[] lookup
        end local 2 // int offset
        end local 1 // byte[] hex
        end local 0 // byte[] bytes
      LocalVariableTable:
        Start  End  Slot    Name  Signature
            0   13     0   bytes  [B
            0   13     1     hex  [B
            0   13     2  offset  I
            2   13     3  lookup  [C
            4   13     4       i  I
            6   11     5       c  I
            7   11     6       j  I
            3   13     7     pos  I
    MethodParameters:
        Name  Flags
      bytes   
      hex     
      offset  
}
SourceFile: "MD5Digest.java"