public final class sun.security.ec.ECDHKeyAgreement extends javax.crypto.KeyAgreementSpi
  minor version: 0
  major version: 59
  flags: flags: (0x0031) ACC_PUBLIC, ACC_FINAL, ACC_SUPER
  this_class: sun.security.ec.ECDHKeyAgreement
  super_class: javax.crypto.KeyAgreementSpi
{
  private java.security.interfaces.ECPrivateKey privateKey;
    descriptor: Ljava/security/interfaces/ECPrivateKey;
    flags: (0x0002) ACC_PRIVATE

  private java.security.interfaces.ECPublicKey publicKey;
    descriptor: Ljava/security/interfaces/ECPublicKey;
    flags: (0x0002) ACC_PRIVATE

  private int secretLen;
    descriptor: I
    flags: (0x0002) ACC_PRIVATE

  public void <init>();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
        start local 0 // sun.security.ec.ECDHKeyAgreement this
         0: .line 62
            aload 0 /* this */
            invokespecial javax.crypto.KeyAgreementSpi.<init>:()V
         1: .line 63
            return
        end local 0 // sun.security.ec.ECDHKeyAgreement this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    2     0  this  Lsun/security/ec/ECDHKeyAgreement;

  protected void engineInit(java.security.Key, java.security.SecureRandom);
    descriptor: (Ljava/security/Key;Ljava/security/SecureRandom;)V
    flags: (0x0004) ACC_PROTECTED
    Code:
      stack=3, locals=3, args_size=3
        start local 0 // sun.security.ec.ECDHKeyAgreement this
        start local 1 // java.security.Key key
        start local 2 // java.security.SecureRandom random
         0: .line 69
            aload 1 /* key */
            instanceof java.security.PrivateKey
            ifne 4
         1: .line 70
            new java.security.InvalidKeyException
            dup
         2: .line 71
            ldc "Key must be instance of PrivateKey"
         3: .line 70
            invokespecial java.security.InvalidKeyException.<init>:(Ljava/lang/String;)V
            athrow
         4: .line 73
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            aload 1 /* key */
            invokestatic sun.security.ec.ECKeyFactory.toECKey:(Ljava/security/Key;)Ljava/security/interfaces/ECKey;
            checkcast java.security.interfaces.ECPrivateKey
            putfield sun.security.ec.ECDHKeyAgreement.privateKey:Ljava/security/interfaces/ECPrivateKey;
         5: .line 74
            aload 0 /* this */
            aconst_null
            putfield sun.security.ec.ECDHKeyAgreement.publicKey:Ljava/security/interfaces/ECPublicKey;
         6: .line 75
            return
        end local 2 // java.security.SecureRandom random
        end local 1 // java.security.Key key
        end local 0 // sun.security.ec.ECDHKeyAgreement this
      LocalVariableTable:
        Start  End  Slot    Name  Signature
            0    7     0    this  Lsun/security/ec/ECDHKeyAgreement;
            0    7     1     key  Ljava/security/Key;
            0    7     2  random  Ljava/security/SecureRandom;
    Exceptions:
      throws java.security.InvalidKeyException
    MethodParameters:
        Name  Flags
      key     
      random  

  protected void engineInit(java.security.Key, java.security.spec.AlgorithmParameterSpec, java.security.SecureRandom);
    descriptor: (Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V
    flags: (0x0004) ACC_PROTECTED
    Code:
      stack=3, locals=4, args_size=4
        start local 0 // sun.security.ec.ECDHKeyAgreement this
        start local 1 // java.security.Key key
        start local 2 // java.security.spec.AlgorithmParameterSpec params
        start local 3 // java.security.SecureRandom random
         0: .line 82
            aload 2 /* params */
            ifnull 4
         1: .line 83
            new java.security.InvalidAlgorithmParameterException
            dup
         2: .line 84
            ldc "Parameters not supported"
         3: .line 83
            invokespecial java.security.InvalidAlgorithmParameterException.<init>:(Ljava/lang/String;)V
            athrow
         4: .line 86
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            aload 1 /* key */
            aload 3 /* random */
            invokevirtual sun.security.ec.ECDHKeyAgreement.engineInit:(Ljava/security/Key;Ljava/security/SecureRandom;)V
         5: .line 87
            return
        end local 3 // java.security.SecureRandom random
        end local 2 // java.security.spec.AlgorithmParameterSpec params
        end local 1 // java.security.Key key
        end local 0 // sun.security.ec.ECDHKeyAgreement this
      LocalVariableTable:
        Start  End  Slot    Name  Signature
            0    6     0    this  Lsun/security/ec/ECDHKeyAgreement;
            0    6     1     key  Ljava/security/Key;
            0    6     2  params  Ljava/security/spec/AlgorithmParameterSpec;
            0    6     3  random  Ljava/security/SecureRandom;
    Exceptions:
      throws java.security.InvalidKeyException, java.security.InvalidAlgorithmParameterException
    MethodParameters:
        Name  Flags
      key     
      params  
      random  

  protected java.security.Key engineDoPhase(java.security.Key, boolean);
    descriptor: (Ljava/security/Key;Z)Ljava/security/Key;
    flags: (0x0004) ACC_PROTECTED
    Code:
      stack=3, locals=5, args_size=3
        start local 0 // sun.security.ec.ECDHKeyAgreement this
        start local 1 // java.security.Key key
        start local 2 // boolean lastPhase
         0: .line 93
            aload 0 /* this */
            getfield sun.security.ec.ECDHKeyAgreement.privateKey:Ljava/security/interfaces/ECPrivateKey;
            ifnonnull 2
         1: .line 94
            new java.lang.IllegalStateException
            dup
            ldc "Not initialized"
            invokespecial java.lang.IllegalStateException.<init>:(Ljava/lang/String;)V
            athrow
         2: .line 96
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            getfield sun.security.ec.ECDHKeyAgreement.publicKey:Ljava/security/interfaces/ECPublicKey;
            ifnull 4
         3: .line 97
            new java.lang.IllegalStateException
            dup
            ldc "Phase already executed"
            invokespecial java.lang.IllegalStateException.<init>:(Ljava/lang/String;)V
            athrow
         4: .line 99
      StackMap locals:
      StackMap stack:
            iload 2 /* lastPhase */
            ifne 8
         5: .line 100
            new java.lang.IllegalStateException
            dup
         6: .line 101
            ldc "Only two party agreement supported, lastPhase must be true"
         7: .line 100
            invokespecial java.lang.IllegalStateException.<init>:(Ljava/lang/String;)V
            athrow
         8: .line 103
      StackMap locals:
      StackMap stack:
            aload 1 /* key */
            instanceof java.security.interfaces.ECPublicKey
            ifne 12
         9: .line 104
            new java.security.InvalidKeyException
            dup
        10: .line 105
            ldc "Key must be a PublicKey with algorithm EC"
        11: .line 104
            invokespecial java.security.InvalidKeyException.<init>:(Ljava/lang/String;)V
            athrow
        12: .line 108
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            aload 1 /* key */
            checkcast java.security.interfaces.ECPublicKey
            putfield sun.security.ec.ECDHKeyAgreement.publicKey:Ljava/security/interfaces/ECPublicKey;
        13: .line 110
            aload 0 /* this */
            getfield sun.security.ec.ECDHKeyAgreement.publicKey:Ljava/security/interfaces/ECPublicKey;
            invokeinterface java.security.interfaces.ECPublicKey.getParams:()Ljava/security/spec/ECParameterSpec;
            astore 3 /* params */
        start local 3 // java.security.spec.ECParameterSpec params
        14: .line 111
            aload 3 /* params */
            invokevirtual java.security.spec.ECParameterSpec.getCurve:()Ljava/security/spec/EllipticCurve;
            invokevirtual java.security.spec.EllipticCurve.getField:()Ljava/security/spec/ECField;
            invokeinterface java.security.spec.ECField.getFieldSize:()I
            istore 4 /* keyLenBits */
        start local 4 // int keyLenBits
        15: .line 112
            aload 0 /* this */
            iload 4 /* keyLenBits */
            bipush 7
            iadd
            iconst_3
            ishr
            putfield sun.security.ec.ECDHKeyAgreement.secretLen:I
        16: .line 114
            aconst_null
            areturn
        end local 4 // int keyLenBits
        end local 3 // java.security.spec.ECParameterSpec params
        end local 2 // boolean lastPhase
        end local 1 // java.security.Key key
        end local 0 // sun.security.ec.ECDHKeyAgreement this
      LocalVariableTable:
        Start  End  Slot        Name  Signature
            0   17     0        this  Lsun/security/ec/ECDHKeyAgreement;
            0   17     1         key  Ljava/security/Key;
            0   17     2   lastPhase  Z
           14   17     3      params  Ljava/security/spec/ECParameterSpec;
           15   17     4  keyLenBits  I
    Exceptions:
      throws java.security.InvalidKeyException, java.lang.IllegalStateException
    MethodParameters:
           Name  Flags
      key        
      lastPhase  

  private static void validateCoordinate(java.math.BigInteger, java.math.BigInteger);
    descriptor: (Ljava/math/BigInteger;Ljava/math/BigInteger;)V
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=3, locals=2, args_size=2
        start local 0 // java.math.BigInteger c
        start local 1 // java.math.BigInteger mod
         0: .line 118
            aload 0 /* c */
            getstatic java.math.BigInteger.ZERO:Ljava/math/BigInteger;
            invokevirtual java.math.BigInteger.compareTo:(Ljava/math/BigInteger;)I
            ifge 2
         1: .line 119
            new java.security.ProviderException
            dup
            ldc "invalid coordinate"
            invokespecial java.security.ProviderException.<init>:(Ljava/lang/String;)V
            athrow
         2: .line 122
      StackMap locals:
      StackMap stack:
            aload 0 /* c */
            aload 1 /* mod */
            invokevirtual java.math.BigInteger.compareTo:(Ljava/math/BigInteger;)I
            iflt 4
         3: .line 123
            new java.security.ProviderException
            dup
            ldc "invalid coordinate"
            invokespecial java.security.ProviderException.<init>:(Ljava/lang/String;)V
            athrow
         4: .line 125
      StackMap locals:
      StackMap stack:
            return
        end local 1 // java.math.BigInteger mod
        end local 0 // java.math.BigInteger c
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    5     0     c  Ljava/math/BigInteger;
            0    5     1   mod  Ljava/math/BigInteger;
    MethodParameters:
      Name  Flags
      c     
      mod   

  private static void validate(sun.security.ec.ECOperations, java.security.interfaces.ECPublicKey);
    descriptor: (Lsun/security/ec/ECOperations;Ljava/security/interfaces/ECPublicKey;)V
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=4, locals=13, args_size=2
        start local 0 // sun.security.ec.ECOperations ops
        start local 1 // java.security.interfaces.ECPublicKey key
         0: .line 134
            aload 1 /* key */
            invokeinterface java.security.interfaces.ECPublicKey.getW:()Ljava/security/spec/ECPoint;
            invokevirtual java.security.spec.ECPoint.getAffineX:()Ljava/math/BigInteger;
            astore 2 /* x */
        start local 2 // java.math.BigInteger x
         1: .line 135
            aload 1 /* key */
            invokeinterface java.security.interfaces.ECPublicKey.getW:()Ljava/security/spec/ECPoint;
            invokevirtual java.security.spec.ECPoint.getAffineY:()Ljava/math/BigInteger;
            astore 3 /* y */
        start local 3 // java.math.BigInteger y
         2: .line 137
            aload 0 /* ops */
            invokevirtual sun.security.ec.ECOperations.getField:()Lsun/security/util/math/IntegerFieldModuloP;
            invokeinterface sun.security.util.math.IntegerFieldModuloP.getSize:()Ljava/math/BigInteger;
            astore 4 /* p */
        start local 4 // java.math.BigInteger p
         3: .line 138
            aload 2 /* x */
            aload 4 /* p */
            invokestatic sun.security.ec.ECDHKeyAgreement.validateCoordinate:(Ljava/math/BigInteger;Ljava/math/BigInteger;)V
         4: .line 139
            aload 3 /* y */
            aload 4 /* p */
            invokestatic sun.security.ec.ECDHKeyAgreement.validateCoordinate:(Ljava/math/BigInteger;Ljava/math/BigInteger;)V
         5: .line 142
            aload 1 /* key */
            invokeinterface java.security.interfaces.ECPublicKey.getParams:()Ljava/security/spec/ECParameterSpec;
            invokevirtual java.security.spec.ECParameterSpec.getCurve:()Ljava/security/spec/EllipticCurve;
            astore 5 /* curve */
        start local 5 // java.security.spec.EllipticCurve curve
         6: .line 143
            aload 2 /* x */
            ldc 3
            invokestatic java.math.BigInteger.valueOf:(J)Ljava/math/BigInteger;
            aload 4 /* p */
            invokevirtual java.math.BigInteger.modPow:(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;
            aload 5 /* curve */
            invokevirtual java.security.spec.EllipticCurve.getA:()Ljava/math/BigInteger;
         7: .line 144
            aload 2 /* x */
            invokevirtual java.math.BigInteger.multiply:(Ljava/math/BigInteger;)Ljava/math/BigInteger;
         8: .line 143
            invokevirtual java.math.BigInteger.add:(Ljava/math/BigInteger;)Ljava/math/BigInteger;
         9: .line 144
            aload 5 /* curve */
            invokevirtual java.security.spec.EllipticCurve.getB:()Ljava/math/BigInteger;
            invokevirtual java.math.BigInteger.add:(Ljava/math/BigInteger;)Ljava/math/BigInteger;
            aload 4 /* p */
            invokevirtual java.math.BigInteger.mod:(Ljava/math/BigInteger;)Ljava/math/BigInteger;
        10: .line 143
            astore 6 /* rhs */
        start local 6 // java.math.BigInteger rhs
        11: .line 145
            aload 3 /* y */
            ldc 2
            invokestatic java.math.BigInteger.valueOf:(J)Ljava/math/BigInteger;
            aload 4 /* p */
            invokevirtual java.math.BigInteger.modPow:(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;
            aload 4 /* p */
            invokevirtual java.math.BigInteger.mod:(Ljava/math/BigInteger;)Ljava/math/BigInteger;
            astore 7 /* lhs */
        start local 7 // java.math.BigInteger lhs
        12: .line 146
            aload 6 /* rhs */
            aload 7 /* lhs */
            invokevirtual java.math.BigInteger.equals:(Ljava/lang/Object;)Z
            ifne 14
        13: .line 147
            new java.security.ProviderException
            dup
            ldc "point is not on curve"
            invokespecial java.security.ProviderException.<init>:(Ljava/lang/String;)V
            athrow
        14: .line 151
      StackMap locals: sun.security.ec.ECOperations java.security.interfaces.ECPublicKey java.math.BigInteger java.math.BigInteger java.math.BigInteger java.security.spec.EllipticCurve java.math.BigInteger java.math.BigInteger
      StackMap stack:
            aload 0 /* ops */
            invokevirtual sun.security.ec.ECOperations.getField:()Lsun/security/util/math/IntegerFieldModuloP;
            aload 2 /* x */
            invokeinterface sun.security.util.math.IntegerFieldModuloP.getElement:(Ljava/math/BigInteger;)Lsun/security/util/math/ImmutableIntegerModuloP;
            astore 8 /* xElem */
        start local 8 // sun.security.util.math.ImmutableIntegerModuloP xElem
        15: .line 152
            aload 0 /* ops */
            invokevirtual sun.security.ec.ECOperations.getField:()Lsun/security/util/math/IntegerFieldModuloP;
            aload 3 /* y */
            invokeinterface sun.security.util.math.IntegerFieldModuloP.getElement:(Ljava/math/BigInteger;)Lsun/security/util/math/ImmutableIntegerModuloP;
            astore 9 /* yElem */
        start local 9 // sun.security.util.math.ImmutableIntegerModuloP yElem
        16: .line 153
            new sun.security.ec.point.AffinePoint
            dup
            aload 8 /* xElem */
            aload 9 /* yElem */
            invokespecial sun.security.ec.point.AffinePoint.<init>:(Lsun/security/util/math/ImmutableIntegerModuloP;Lsun/security/util/math/ImmutableIntegerModuloP;)V
            astore 10 /* affP */
        start local 10 // sun.security.ec.point.AffinePoint affP
        17: .line 154
            aload 1 /* key */
            invokeinterface java.security.interfaces.ECPublicKey.getParams:()Ljava/security/spec/ECParameterSpec;
            invokevirtual java.security.spec.ECParameterSpec.getOrder:()Ljava/math/BigInteger;
            invokevirtual java.math.BigInteger.toByteArray:()[B
            astore 11 /* order */
        start local 11 // byte[] order
        18: .line 155
            aload 11 /* order */
            invokestatic sun.security.util.ArrayUtil.reverse:([B)V
        19: .line 156
            aload 0 /* ops */
            aload 10 /* affP */
            aload 11 /* order */
            invokevirtual sun.security.ec.ECOperations.multiply:(Lsun/security/ec/point/AffinePoint;[B)Lsun/security/ec/point/MutablePoint;
            astore 12 /* product */
        start local 12 // sun.security.ec.point.Point product
        20: .line 157
            aload 0 /* ops */
            aload 12 /* product */
            invokevirtual sun.security.ec.ECOperations.isNeutral:(Lsun/security/ec/point/Point;)Z
            ifne 22
        21: .line 158
            new java.security.ProviderException
            dup
            ldc "point has incorrect order"
            invokespecial java.security.ProviderException.<init>:(Ljava/lang/String;)V
            athrow
        22: .line 161
      StackMap locals: sun.security.ec.ECOperations java.security.interfaces.ECPublicKey java.math.BigInteger java.math.BigInteger java.math.BigInteger java.security.spec.EllipticCurve java.math.BigInteger java.math.BigInteger sun.security.util.math.ImmutableIntegerModuloP sun.security.util.math.ImmutableIntegerModuloP sun.security.ec.point.AffinePoint byte[] sun.security.ec.point.Point
      StackMap stack:
            return
        end local 12 // sun.security.ec.point.Point product
        end local 11 // byte[] order
        end local 10 // sun.security.ec.point.AffinePoint affP
        end local 9 // sun.security.util.math.ImmutableIntegerModuloP yElem
        end local 8 // sun.security.util.math.ImmutableIntegerModuloP xElem
        end local 7 // java.math.BigInteger lhs
        end local 6 // java.math.BigInteger rhs
        end local 5 // java.security.spec.EllipticCurve curve
        end local 4 // java.math.BigInteger p
        end local 3 // java.math.BigInteger y
        end local 2 // java.math.BigInteger x
        end local 1 // java.security.interfaces.ECPublicKey key
        end local 0 // sun.security.ec.ECOperations ops
      LocalVariableTable:
        Start  End  Slot     Name  Signature
            0   23     0      ops  Lsun/security/ec/ECOperations;
            0   23     1      key  Ljava/security/interfaces/ECPublicKey;
            1   23     2        x  Ljava/math/BigInteger;
            2   23     3        y  Ljava/math/BigInteger;
            3   23     4        p  Ljava/math/BigInteger;
            6   23     5    curve  Ljava/security/spec/EllipticCurve;
           11   23     6      rhs  Ljava/math/BigInteger;
           12   23     7      lhs  Ljava/math/BigInteger;
           15   23     8    xElem  Lsun/security/util/math/ImmutableIntegerModuloP;
           16   23     9    yElem  Lsun/security/util/math/ImmutableIntegerModuloP;
           17   23    10     affP  Lsun/security/ec/point/AffinePoint;
           18   23    11    order  [B
           20   23    12  product  Lsun/security/ec/point/Point;
    MethodParameters:
      Name  Flags
      ops   
      key   

  protected byte[] engineGenerateSecret();
    descriptor: ()[B
    flags: (0x0004) ACC_PROTECTED
    Code:
      stack=4, locals=2, args_size=1
        start local 0 // sun.security.ec.ECDHKeyAgreement this
         0: .line 166
            aload 0 /* this */
            getfield sun.security.ec.ECDHKeyAgreement.privateKey:Ljava/security/interfaces/ECPrivateKey;
            ifnull 1
            aload 0 /* this */
            getfield sun.security.ec.ECDHKeyAgreement.publicKey:Ljava/security/interfaces/ECPublicKey;
            ifnonnull 2
         1: .line 167
      StackMap locals:
      StackMap stack:
            new java.lang.IllegalStateException
            dup
            ldc "Not initialized correctly"
            invokespecial java.lang.IllegalStateException.<init>:(Ljava/lang/String;)V
            athrow
         2: .line 170
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            getfield sun.security.ec.ECDHKeyAgreement.privateKey:Ljava/security/interfaces/ECPrivateKey;
            aload 0 /* this */
            getfield sun.security.ec.ECDHKeyAgreement.publicKey:Ljava/security/interfaces/ECPublicKey;
            invokestatic sun.security.ec.ECDHKeyAgreement.deriveKeyImpl:(Ljava/security/interfaces/ECPrivateKey;Ljava/security/interfaces/ECPublicKey;)Lsun/security/util/Optional;
            astore 1 /* resultOpt */
        start local 1 // sun.security.util.Optional resultOpt
         3: .line 171
            aload 1 /* resultOpt */
            new sun.security.ec.ECDHKeyAgreement$1
            dup
            aload 0 /* this */
            invokespecial sun.security.ec.ECDHKeyAgreement$1.<init>:(Lsun/security/ec/ECDHKeyAgreement;)V
            invokevirtual sun.security.util.Optional.orElseGet:(Lsun/security/util/Supplier;)Ljava/lang/Object;
            checkcast byte[]
            areturn
        end local 1 // sun.security.util.Optional resultOpt
        end local 0 // sun.security.ec.ECDHKeyAgreement this
      LocalVariableTable:
        Start  End  Slot       Name  Signature
            0    4     0       this  Lsun/security/ec/ECDHKeyAgreement;
            3    4     1  resultOpt  Lsun/security/util/Optional<[B>;
    Exceptions:
      throws java.lang.IllegalStateException

  protected int engineGenerateSecret(byte[], int);
    descriptor: ([BI)I
    flags: (0x0004) ACC_PROTECTED
    Code:
      stack=5, locals=4, args_size=3
        start local 0 // sun.security.ec.ECDHKeyAgreement this
        start local 1 // byte[] sharedSecret
        start local 2 // int offset
         0: .line 181
            iload 2 /* offset */
            aload 0 /* this */
            getfield sun.security.ec.ECDHKeyAgreement.secretLen:I
            iadd
            aload 1 /* sharedSecret */
            arraylength
            if_icmple 5
         1: .line 182
            new javax.crypto.ShortBufferException
            dup
            new java.lang.StringBuilder
            dup
            ldc "Need "
            invokespecial java.lang.StringBuilder.<init>:(Ljava/lang/String;)V
            aload 0 /* this */
            getfield sun.security.ec.ECDHKeyAgreement.secretLen:I
            invokevirtual java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder;
         2: .line 183
            ldc " bytes, only "
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            aload 1 /* sharedSecret */
            arraylength
            iload 2 /* offset */
            isub
            invokevirtual java.lang.StringBuilder.append:(I)Ljava/lang/StringBuilder;
         3: .line 184
            ldc " available"
            invokevirtual java.lang.StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            invokevirtual java.lang.StringBuilder.toString:()Ljava/lang/String;
         4: .line 182
            invokespecial javax.crypto.ShortBufferException.<init>:(Ljava/lang/String;)V
            athrow
         5: .line 186
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            invokevirtual sun.security.ec.ECDHKeyAgreement.engineGenerateSecret:()[B
            astore 3 /* secret */
        start local 3 // byte[] secret
         6: .line 187
            aload 3 /* secret */
            iconst_0
            aload 1 /* sharedSecret */
            iload 2 /* offset */
            aload 3 /* secret */
            arraylength
            invokestatic java.lang.System.arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V
         7: .line 188
            aload 3 /* secret */
            arraylength
            ireturn
        end local 3 // byte[] secret
        end local 2 // int offset
        end local 1 // byte[] sharedSecret
        end local 0 // sun.security.ec.ECDHKeyAgreement this
      LocalVariableTable:
        Start  End  Slot          Name  Signature
            0    8     0          this  Lsun/security/ec/ECDHKeyAgreement;
            0    8     1  sharedSecret  [B
            0    8     2        offset  I
            6    8     3        secret  [B
    Exceptions:
      throws java.lang.IllegalStateException, javax.crypto.ShortBufferException
    MethodParameters:
              Name  Flags
      sharedSecret  
      offset        

  protected javax.crypto.SecretKey engineGenerateSecret(java.lang.String);
    descriptor: (Ljava/lang/String;)Ljavax/crypto/SecretKey;
    flags: (0x0004) ACC_PROTECTED
    Code:
      stack=4, locals=2, args_size=2
        start local 0 // sun.security.ec.ECDHKeyAgreement this
        start local 1 // java.lang.String algorithm
         0: .line 196
            aload 1 /* algorithm */
            ifnonnull 2
         1: .line 197
            new java.security.NoSuchAlgorithmException
            dup
            ldc "Algorithm must not be null"
            invokespecial java.security.NoSuchAlgorithmException.<init>:(Ljava/lang/String;)V
            athrow
         2: .line 199
      StackMap locals:
      StackMap stack:
            aload 1 /* algorithm */
            ldc "TlsPremasterSecret"
            invokevirtual java.lang.String.equals:(Ljava/lang/Object;)Z
            ifne 6
         3: .line 200
            new java.security.NoSuchAlgorithmException
            dup
         4: .line 201
            ldc "Only supported for algorithm TlsPremasterSecret"
         5: .line 200
            invokespecial java.security.NoSuchAlgorithmException.<init>:(Ljava/lang/String;)V
            athrow
         6: .line 203
      StackMap locals:
      StackMap stack:
            new javax.crypto.spec.SecretKeySpec
            dup
            aload 0 /* this */
            invokevirtual sun.security.ec.ECDHKeyAgreement.engineGenerateSecret:()[B
            ldc "TlsPremasterSecret"
            invokespecial javax.crypto.spec.SecretKeySpec.<init>:([BLjava/lang/String;)V
            areturn
        end local 1 // java.lang.String algorithm
        end local 0 // sun.security.ec.ECDHKeyAgreement this
      LocalVariableTable:
        Start  End  Slot       Name  Signature
            0    7     0       this  Lsun/security/ec/ECDHKeyAgreement;
            0    7     1  algorithm  Ljava/lang/String;
    Exceptions:
      throws java.lang.IllegalStateException, java.security.NoSuchAlgorithmException, java.security.InvalidKeyException
    MethodParameters:
           Name  Flags
      algorithm  

  private static sun.security.util.Optional<byte[]> deriveKeyImpl(java.security.interfaces.ECPrivateKey, java.security.interfaces.ECPublicKey);
    descriptor: (Ljava/security/interfaces/ECPrivateKey;Ljava/security/interfaces/ECPublicKey;)Lsun/security/util/Optional;
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=4, locals=19, args_size=2
        start local 0 // java.security.interfaces.ECPrivateKey priv
        start local 1 // java.security.interfaces.ECPublicKey pubKey
         0: .line 209
            aload 0 /* priv */
            invokeinterface java.security.interfaces.ECPrivateKey.getParams:()Ljava/security/spec/ECParameterSpec;
            astore 2 /* ecSpec */
        start local 2 // java.security.spec.ECParameterSpec ecSpec
         1: .line 210
            aload 2 /* ecSpec */
            invokevirtual java.security.spec.ECParameterSpec.getCurve:()Ljava/security/spec/EllipticCurve;
            astore 3 /* curve */
        start local 3 // java.security.spec.EllipticCurve curve
         2: .line 211
            aload 2 /* ecSpec */
            invokestatic sun.security.ec.ECOperations.forParameters:(Ljava/security/spec/ECParameterSpec;)Lsun/security/util/Optional;
            astore 4 /* opsOpt */
        start local 4 // sun.security.util.Optional opsOpt
         3: .line 212
            aload 4 /* opsOpt */
            invokevirtual sun.security.util.Optional.isEmpty:()Z
            ifeq 5
         4: .line 213
            invokestatic sun.security.util.Optional.empty:()Lsun/security/util/Optional;
            areturn
         5: .line 215
      StackMap locals: java.security.spec.ECParameterSpec java.security.spec.EllipticCurve sun.security.util.Optional
      StackMap stack:
            aload 4 /* opsOpt */
            invokevirtual sun.security.util.Optional.get:()Ljava/lang/Object;
            checkcast sun.security.ec.ECOperations
            astore 5 /* ops */
        start local 5 // sun.security.ec.ECOperations ops
         6: .line 216
            aload 0 /* priv */
            instanceof sun.security.ec.ECPrivateKeyImpl
            ifne 8
         7: .line 217
            invokestatic sun.security.util.Optional.empty:()Lsun/security/util/Optional;
            areturn
         8: .line 219
      StackMap locals: sun.security.ec.ECOperations
      StackMap stack:
            aload 0 /* priv */
            checkcast sun.security.ec.ECPrivateKeyImpl
            astore 6 /* privImpl */
        start local 6 // sun.security.ec.ECPrivateKeyImpl privImpl
         9: .line 220
            aload 6 /* privImpl */
            invokevirtual sun.security.ec.ECPrivateKeyImpl.getArrayS:()[B
            astore 7 /* sArr */
        start local 7 // byte[] sArr
        10: .line 224
            aload 5 /* ops */
            aload 1 /* pubKey */
            invokestatic sun.security.ec.ECDHKeyAgreement.validate:(Lsun/security/ec/ECOperations;Ljava/security/interfaces/ECPublicKey;)V
        11: .line 226
            aload 5 /* ops */
            invokevirtual sun.security.ec.ECOperations.getField:()Lsun/security/util/math/IntegerFieldModuloP;
            astore 8 /* field */
        start local 8 // sun.security.util.math.IntegerFieldModuloP field
        12: .line 228
            aload 8 /* field */
            aload 7 /* sArr */
            invokeinterface sun.security.util.math.IntegerFieldModuloP.getElement:([B)Lsun/security/util/math/ImmutableIntegerModuloP;
            invokeinterface sun.security.util.math.ImmutableIntegerModuloP.mutable:()Lsun/security/util/math/MutableIntegerModuloP;
            astore 9 /* scalar */
        start local 9 // sun.security.util.math.MutableIntegerModuloP scalar
        13: .line 230
            aload 8 /* field */
            aload 0 /* priv */
            invokeinterface java.security.interfaces.ECPrivateKey.getParams:()Ljava/security/spec/ECParameterSpec;
            invokevirtual java.security.spec.ECParameterSpec.getCofactor:()I
            invokeinterface sun.security.util.math.IntegerFieldModuloP.getSmallValue:(I)Lsun/security/util/math/SmallValue;
        14: .line 229
            astore 10 /* cofactor */
        start local 10 // sun.security.util.math.SmallValue cofactor
        15: .line 231
            aload 9 /* scalar */
            aload 10 /* cofactor */
            invokeinterface sun.security.util.math.MutableIntegerModuloP.setProduct:(Lsun/security/util/math/SmallValue;)Lsun/security/util/math/MutableIntegerModuloP;
            pop
        16: .line 232
            aload 3 /* curve */
            invokevirtual java.security.spec.EllipticCurve.getField:()Ljava/security/spec/ECField;
            invokeinterface java.security.spec.ECField.getFieldSize:()I
            bipush 7
            iadd
            bipush 8
            idiv
            istore 11 /* keySize */
        start local 11 // int keySize
        17: .line 233
            aload 9 /* scalar */
            iload 11 /* keySize */
            invokeinterface sun.security.util.math.MutableIntegerModuloP.asByteArray:(I)[B
            astore 12 /* privArr */
        start local 12 // byte[] privArr
        18: .line 236
            aload 8 /* field */
            aload 1 /* pubKey */
            invokeinterface java.security.interfaces.ECPublicKey.getW:()Ljava/security/spec/ECPoint;
            invokevirtual java.security.spec.ECPoint.getAffineX:()Ljava/math/BigInteger;
            invokeinterface sun.security.util.math.IntegerFieldModuloP.getElement:(Ljava/math/BigInteger;)Lsun/security/util/math/ImmutableIntegerModuloP;
        19: .line 235
            astore 13 /* x */
        start local 13 // sun.security.util.math.ImmutableIntegerModuloP x
        20: .line 238
            aload 8 /* field */
            aload 1 /* pubKey */
            invokeinterface java.security.interfaces.ECPublicKey.getW:()Ljava/security/spec/ECPoint;
            invokevirtual java.security.spec.ECPoint.getAffineY:()Ljava/math/BigInteger;
            invokeinterface sun.security.util.math.IntegerFieldModuloP.getElement:(Ljava/math/BigInteger;)Lsun/security/util/math/ImmutableIntegerModuloP;
        21: .line 237
            astore 14 /* y */
        start local 14 // sun.security.util.math.ImmutableIntegerModuloP y
        22: .line 239
            new sun.security.ec.point.AffinePoint
            dup
            aload 13 /* x */
            aload 14 /* y */
            invokespecial sun.security.ec.point.AffinePoint.<init>:(Lsun/security/util/math/ImmutableIntegerModuloP;Lsun/security/util/math/ImmutableIntegerModuloP;)V
            astore 15 /* affPub */
        start local 15 // sun.security.ec.point.AffinePoint affPub
        23: .line 240
            aload 5 /* ops */
            aload 15 /* affPub */
            aload 12 /* privArr */
            invokevirtual sun.security.ec.ECOperations.multiply:(Lsun/security/ec/point/AffinePoint;[B)Lsun/security/ec/point/MutablePoint;
            astore 16 /* product */
        start local 16 // sun.security.ec.point.Point product
        24: .line 241
            aload 5 /* ops */
            aload 16 /* product */
            invokevirtual sun.security.ec.ECOperations.isNeutral:(Lsun/security/ec/point/Point;)Z
            ifeq 26
        25: .line 242
            new java.security.ProviderException
            dup
            ldc "Product is zero"
            invokespecial java.security.ProviderException.<init>:(Ljava/lang/String;)V
            athrow
        26: .line 244
      StackMap locals: java.security.interfaces.ECPrivateKey java.security.interfaces.ECPublicKey java.security.spec.ECParameterSpec java.security.spec.EllipticCurve sun.security.util.Optional sun.security.ec.ECOperations sun.security.ec.ECPrivateKeyImpl byte[] sun.security.util.math.IntegerFieldModuloP sun.security.util.math.MutableIntegerModuloP sun.security.util.math.SmallValue int byte[] sun.security.util.math.ImmutableIntegerModuloP sun.security.util.math.ImmutableIntegerModuloP sun.security.ec.point.AffinePoint sun.security.ec.point.Point
      StackMap stack:
            aload 16 /* product */
            invokeinterface sun.security.ec.point.Point.asAffine:()Lsun/security/ec/point/AffinePoint;
            astore 17 /* affProduct */
        start local 17 // sun.security.ec.point.AffinePoint affProduct
        27: .line 246
            aload 17 /* affProduct */
            invokevirtual sun.security.ec.point.AffinePoint.getX:()Lsun/security/util/math/ImmutableIntegerModuloP;
            iload 11 /* keySize */
            invokeinterface sun.security.util.math.ImmutableIntegerModuloP.asByteArray:(I)[B
            astore 18 /* result */
        start local 18 // byte[] result
        28: .line 247
            aload 18 /* result */
            invokestatic sun.security.util.ArrayUtil.reverse:([B)V
        29: .line 249
            aload 18 /* result */
            invokestatic sun.security.util.Optional.of:(Ljava/lang/Object;)Lsun/security/util/Optional;
            areturn
        end local 18 // byte[] result
        end local 17 // sun.security.ec.point.AffinePoint affProduct
        end local 16 // sun.security.ec.point.Point product
        end local 15 // sun.security.ec.point.AffinePoint affPub
        end local 14 // sun.security.util.math.ImmutableIntegerModuloP y
        end local 13 // sun.security.util.math.ImmutableIntegerModuloP x
        end local 12 // byte[] privArr
        end local 11 // int keySize
        end local 10 // sun.security.util.math.SmallValue cofactor
        end local 9 // sun.security.util.math.MutableIntegerModuloP scalar
        end local 8 // sun.security.util.math.IntegerFieldModuloP field
        end local 7 // byte[] sArr
        end local 6 // sun.security.ec.ECPrivateKeyImpl privImpl
        end local 5 // sun.security.ec.ECOperations ops
        end local 4 // sun.security.util.Optional opsOpt
        end local 3 // java.security.spec.EllipticCurve curve
        end local 2 // java.security.spec.ECParameterSpec ecSpec
        end local 1 // java.security.interfaces.ECPublicKey pubKey
        end local 0 // java.security.interfaces.ECPrivateKey priv
      LocalVariableTable:
        Start  End  Slot        Name  Signature
            0   30     0        priv  Ljava/security/interfaces/ECPrivateKey;
            0   30     1      pubKey  Ljava/security/interfaces/ECPublicKey;
            1   30     2      ecSpec  Ljava/security/spec/ECParameterSpec;
            2   30     3       curve  Ljava/security/spec/EllipticCurve;
            3   30     4      opsOpt  Lsun/security/util/Optional<Lsun/security/ec/ECOperations;>;
            6   30     5         ops  Lsun/security/ec/ECOperations;
            9   30     6    privImpl  Lsun/security/ec/ECPrivateKeyImpl;
           10   30     7        sArr  [B
           12   30     8       field  Lsun/security/util/math/IntegerFieldModuloP;
           13   30     9      scalar  Lsun/security/util/math/MutableIntegerModuloP;
           15   30    10    cofactor  Lsun/security/util/math/SmallValue;
           17   30    11     keySize  I
           18   30    12     privArr  [B
           20   30    13           x  Lsun/security/util/math/ImmutableIntegerModuloP;
           22   30    14           y  Lsun/security/util/math/ImmutableIntegerModuloP;
           23   30    15      affPub  Lsun/security/ec/point/AffinePoint;
           24   30    16     product  Lsun/security/ec/point/Point;
           27   30    17  affProduct  Lsun/security/ec/point/AffinePoint;
           28   30    18      result  [B
    Signature: (Ljava/security/interfaces/ECPrivateKey;Ljava/security/interfaces/ECPublicKey;)Lsun/security/util/Optional<[B>;
    MethodParameters:
        Name  Flags
      priv    
      pubKey  

  private static byte[] deriveKeyNative(java.security.interfaces.ECPrivateKey, java.security.interfaces.ECPublicKey);
    descriptor: (Ljava/security/interfaces/ECPrivateKey;Ljava/security/interfaces/ECPublicKey;)[B
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=4, locals=7, args_size=2
        start local 0 // java.security.interfaces.ECPrivateKey privateKey
        start local 1 // java.security.interfaces.ECPublicKey publicKey
         0: .line 255
            aload 0 /* privateKey */
            invokeinterface java.security.interfaces.ECPrivateKey.getParams:()Ljava/security/spec/ECParameterSpec;
            astore 2 /* params */
        start local 2 // java.security.spec.ECParameterSpec params
         1: .line 256
            aload 0 /* privateKey */
            invokeinterface java.security.interfaces.ECPrivateKey.getS:()Ljava/math/BigInteger;
            invokevirtual java.math.BigInteger.toByteArray:()[B
            astore 3 /* s */
        start local 3 // byte[] s
         2: .line 258
            aconst_null
            aload 2 /* params */
            invokestatic sun.security.util.ECUtil.encodeECParameterSpec:(Ljava/security/Provider;Ljava/security/spec/ECParameterSpec;)[B
         3: .line 257
            astore 4 /* encodedParams */
        start local 4 // byte[] encodedParams
         4: .line 261
            aload 1 /* publicKey */
            instanceof sun.security.ec.ECPublicKeyImpl
            ifeq 8
         5: .line 262
            aload 1 /* publicKey */
            checkcast sun.security.ec.ECPublicKeyImpl
            astore 6 /* ecPub */
        start local 6 // sun.security.ec.ECPublicKeyImpl ecPub
         6: .line 263
            aload 6 /* ecPub */
            invokevirtual sun.security.ec.ECPublicKeyImpl.getEncodedPublicValue:()[B
            astore 5 /* publicValue */
        end local 6 // sun.security.ec.ECPublicKeyImpl ecPub
        start local 5 // byte[] publicValue
         7: .line 264
            goto 10
        end local 5 // byte[] publicValue
         8: .line 266
      StackMap locals: java.security.spec.ECParameterSpec byte[] byte[]
      StackMap stack:
            aload 1 /* publicKey */
            invokeinterface java.security.interfaces.ECPublicKey.getW:()Ljava/security/spec/ECPoint;
            aload 2 /* params */
            invokevirtual java.security.spec.ECParameterSpec.getCurve:()Ljava/security/spec/EllipticCurve;
            invokestatic sun.security.util.ECUtil.encodePoint:(Ljava/security/spec/ECPoint;Ljava/security/spec/EllipticCurve;)[B
         9: .line 265
            astore 5 /* publicValue */
        start local 5 // byte[] publicValue
        10: .line 270
      StackMap locals: byte[]
      StackMap stack:
            aload 3 /* s */
            aload 5 /* publicValue */
            aload 4 /* encodedParams */
            invokestatic sun.security.ec.ECDHKeyAgreement.deriveKey:([B[B[B)[B
        11: areturn
        12: .line 272
      StackMap locals:
      StackMap stack: java.security.GeneralSecurityException
            astore 6 /* e */
        start local 6 // java.security.GeneralSecurityException e
        13: .line 273
            new java.security.ProviderException
            dup
            ldc "Could not derive key"
            aload 6 /* e */
            invokespecial java.security.ProviderException.<init>:(Ljava/lang/String;Ljava/lang/Throwable;)V
            athrow
        end local 6 // java.security.GeneralSecurityException e
        end local 5 // byte[] publicValue
        end local 4 // byte[] encodedParams
        end local 3 // byte[] s
        end local 2 // java.security.spec.ECParameterSpec params
        end local 1 // java.security.interfaces.ECPublicKey publicKey
        end local 0 // java.security.interfaces.ECPrivateKey privateKey
      LocalVariableTable:
        Start  End  Slot           Name  Signature
            0   14     0     privateKey  Ljava/security/interfaces/ECPrivateKey;
            0   14     1      publicKey  Ljava/security/interfaces/ECPublicKey;
            1   14     2         params  Ljava/security/spec/ECParameterSpec;
            2   14     3              s  [B
            4   14     4  encodedParams  [B
            7    8     5    publicValue  [B
           10   14     5    publicValue  [B
            6    7     6          ecPub  Lsun/security/ec/ECPublicKeyImpl;
           13   14     6              e  Ljava/security/GeneralSecurityException;
      Exception table:
        from    to  target  type
          10    11      12  Class java.security.GeneralSecurityException
    MethodParameters:
            Name  Flags
      privateKey  
      publicKey   

  private static native byte[] deriveKey(byte[], byte[], byte[]);
    descriptor: ([B[B[B)[B
    flags: (0x010a) ACC_PRIVATE, ACC_STATIC, ACC_NATIVE
    Exceptions:
      throws java.security.GeneralSecurityException
    MethodParameters:
               Name  Flags
      s              
      w              
      encodedParams  
}
SourceFile: "ECDHKeyAgreement.java"
NestMembers:
  sun.security.ec.ECDHKeyAgreement$1
InnerClasses:
  sun.security.ec.ECDHKeyAgreement$1