gt:             DERInteger          derD = (DERInteger)info.getPrivateKey();
context: /* Copyright Statement:
   *
   * This software/firmware and related documentation ("MediaTek Software") are
   * protected under relevant copyright laws. The information contained herein is
   * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
   * the prior written permission of MediaTek inc. and/or its licensors, any
   * reproduction, modification, use or disclosure of MediaTek Software, and
   * information contained herein, in whole or in part, shall be strictly
   * prohibited.
   * 
   * MediaTek Inc. (C) 2010. All rights reserved.
   * 
   * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
   * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
   * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
   * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
   * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
   * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
   * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
   * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
   * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
   * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
   * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
   * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
   * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
   * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
   * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
   * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
   * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
   * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
   * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
   *
   * The following software/firmware and/or related documentation ("MediaTek
   * Software") have been modified by MediaTek Inc. All revisions are subject to
   * any receiver's applicable license agreements with MediaTek Inc.
   */
  
  package org.bouncycastle.jce.provider;
  
  import java.io.IOException;
  import java.io.ObjectInputStream;
  import java.io.ObjectOutputStream;
  import java.math.BigInteger;
  import java.security.interfaces.ECPrivateKey;
  import java.security.spec.ECParameterSpec;
  import java.security.spec.ECPoint;
  import java.security.spec.ECPrivateKeySpec;
  import java.security.spec.EllipticCurve;
  import java.util.Enumeration;
  
  import org.bouncycastle.asn1.ASN1Object;
  import org.bouncycastle.asn1.ASN1Sequence;
  import org.bouncycastle.asn1.DERBitString;
  import org.bouncycastle.asn1.DEREncodable;
  import org.bouncycastle.asn1.DERInteger;
  import org.bouncycastle.asn1.DERNull;
  import org.bouncycastle.asn1.DERObject;
  import org.bouncycastle.asn1.DERObjectIdentifier;
  import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;
  // BEGIN android-removed
  // import org.bouncycastle.asn1.cryptopro.ECGOST3410NamedCurves;
  // END android-removed
  import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
  import org.bouncycastle.asn1.sec.ECPrivateKeyStructure;
  import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
  import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
  import org.bouncycastle.asn1.x9.X962Parameters;
  import org.bouncycastle.asn1.x9.X9ECParameters;
  import org.bouncycastle.asn1.x9.X9ObjectIdentifiers;
  import org.bouncycastle.crypto.params.ECDomainParameters;
  import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
  import org.bouncycastle.jce.interfaces.ECPointEncoder;
  import org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier;
  import org.bouncycastle.jce.provider.asymmetric.ec.EC5Util;
  import org.bouncycastle.jce.provider.asymmetric.ec.ECUtil;
  import org.bouncycastle.jce.spec.ECNamedCurveSpec;
  import org.bouncycastle.math.ec.ECCurve;
  
  public class JCEECPrivateKey
      implements ECPrivateKey, org.bouncycastle.jce.interfaces.ECPrivateKey, PKCS12BagAttributeCarrier, ECPointEncoder
  {
      private String          algorithm = "EC";
      private BigInteger      d;
      private ECParameterSpec ecSpec;
      private boolean         withCompression;
  
      private DERBitString publicKey;
  
      private PKCS12BagAttributeCarrierImpl attrCarrier = new PKCS12BagAttributeCarrierImpl();
  
      protected JCEECPrivateKey()
      {
      }
  
      public JCEECPrivateKey(
          ECPrivateKey    key)
      {
          this.d = key.getS();
          this.algorithm = key.getAlgorithm();
          this.ecSpec = key.getParams();
      }
  
      public JCEECPrivateKey(
          String              algorithm,
          org.bouncycastle.jce.spec.ECPrivateKeySpec     spec)
      {
          this.algorithm = algorithm;
          this.d = spec.getD();
  
          if (spec.getParams() != null) // can be null if implicitlyCA
          {
              ECCurve curve = spec.getParams().getCurve();
              EllipticCurve ellipticCurve;
  
              ellipticCurve = EC5Util.convertCurve(curve, spec.getParams().getSeed());
  
              this.ecSpec = EC5Util.convertSpec(ellipticCurve, spec.getParams());
          }
          else
          {
              this.ecSpec = null;
          }
      }
  
  
      public JCEECPrivateKey(
          String              algorithm,
          ECPrivateKeySpec    spec)
      {
          this.algorithm = algorithm;
          this.d = spec.getS();
          this.ecSpec = spec.getParams();
      }
  
      public JCEECPrivateKey(
          String             algorithm,
          JCEECPrivateKey    key)
      {
          this.algorithm = algorithm;
          this.d = key.d;
          this.ecSpec = key.ecSpec;
          this.withCompression = key.withCompression;
          this.attrCarrier = key.attrCarrier;
          this.publicKey = key.publicKey;
      }
  
      public JCEECPrivateKey(
          String                  algorithm,
          ECPrivateKeyParameters  params,
          JCEECPublicKey          pubKey,
          ECParameterSpec         spec)
      {
          ECDomainParameters      dp = params.getParameters();
  
          this.algorithm = algorithm;
          this.d = params.getD();
  
          if (spec == null)
          {
              EllipticCurve ellipticCurve = EC5Util.convertCurve(dp.getCurve(), dp.getSeed());
  
              this.ecSpec = new ECParameterSpec(
                              ellipticCurve,
                              new ECPoint(
                                      dp.getG().getX().toBigInteger(),
                                      dp.getG().getY().toBigInteger()),
                              dp.getN(),
                              dp.getH().intValue());
          }
          else
          {
              this.ecSpec = spec;
          }
  
          publicKey = getPublicKeyDetails(pubKey);
      }
  
      public JCEECPrivateKey(
          String                  algorithm,
          ECPrivateKeyParameters  params,
          JCEECPublicKey          pubKey,
          org.bouncycastle.jce.spec.ECParameterSpec         spec)
      {
          ECDomainParameters      dp = params.getParameters();
  
          this.algorithm = algorithm;
          this.d = params.getD();
  
          if (spec == null)
          {
              EllipticCurve ellipticCurve = EC5Util.convertCurve(dp.getCurve(), dp.getSeed());
  
              this.ecSpec = new ECParameterSpec(
                              ellipticCurve,
                              new ECPoint(
                                      dp.getG().getX().toBigInteger(),
                                      dp.getG().getY().toBigInteger()),
                              dp.getN(),
                              dp.getH().intValue());
          }
          else
          {
              EllipticCurve ellipticCurve = EC5Util.convertCurve(spec.getCurve(), spec.getSeed());
              
              this.ecSpec = new ECParameterSpec(
                                  ellipticCurve,
                                  new ECPoint(
                                          spec.getG().getX().toBigInteger(),
                                          spec.getG().getY().toBigInteger()),
                                  spec.getN(),
                                  spec.getH().intValue());
          }
  
          publicKey = getPublicKeyDetails(pubKey);
      }
  
      public JCEECPrivateKey(
          String                  algorithm,
          ECPrivateKeyParameters  params)
      {
          this.algorithm = algorithm;
          this.d = params.getD();
          this.ecSpec = null;
      }
  
      JCEECPrivateKey(
          PrivateKeyInfo      info)
      {
          populateFromPrivKeyInfo(info);
      }
  
      private void populateFromPrivKeyInfo(PrivateKeyInfo info)
      {
          X962Parameters params = new X962Parameters((DERObject)info.getAlgorithmId().getParameters());
  
          if (params.isNamedCurve())
          {
              DERObjectIdentifier oid = (DERObjectIdentifier)params.getParameters();
              X9ECParameters ecP = ECUtil.getNamedCurveByOid(oid);
  
              // BEGIN android-removed
              // if (ecP == null) // GOST Curve
              // {
              //     ECDomainParameters gParam = ECGOST3410NamedCurves.getByOID(oid);
              //     EllipticCurve ellipticCurve = EC5Util.convertCurve(gParam.getCurve(), gParam.getSeed());
              //
              //     ecSpec = new ECNamedCurveSpec(
              //             ECGOST3410NamedCurves.getName(oid),
              //             ellipticCurve,
              //             new ECPoint(
              //                     gParam.getG().getX().toBigInteger(),
              //                     gParam.getG().getY().toBigInteger()),
              //             gParam.getN(),
              //             gParam.getH());
              // }
              // else
              // END android-removed
              {
                  EllipticCurve ellipticCurve = EC5Util.convertCurve(ecP.getCurve(), ecP.getSeed());
  
                  ecSpec = new ECNamedCurveSpec(
                          ECUtil.getCurveName(oid),
                          ellipticCurve,
                          new ECPoint(
                                  ecP.getG().getX().toBigInteger(),
                                  ecP.getG().getY().toBigInteger()),
                          ecP.getN(),
                          ecP.getH());
              }
          }
          else if (params.isImplicitlyCA())
          {
              ecSpec = null;
          }
          else
          {
              X9ECParameters      ecP = new X9ECParameters((ASN1Sequence)params.getParameters());
              EllipticCurve       ellipticCurve = EC5Util.convertCurve(ecP.getCurve(), ecP.getSeed());
  
              this.ecSpec = new ECParameterSpec(
                  ellipticCurve,
                  new ECPoint(
                          ecP.getG().getX().toBigInteger(),
                          ecP.getG().getY().toBigInteger()),
                  ecP.getN(),
                  ecP.getH().intValue());
          }
  
          if (info.getPrivateKey() instanceof DERInteger)
          {
  