private void setPublicPointY(ASN1OctetString publicPointY) throws IllegalArgumentException {
   if ((options & Y) == 0) {
     options |= Y;
     this.publicPointY = publicPointY.getOctets();
   } else {
     throw new IllegalArgumentException("Public Point Y already set");
   }
 }
 private void setBasePointG(ASN1OctetString basePointG) throws IllegalArgumentException {
   if ((options & G) == 0) {
     options |= G;
     this.basePointG = basePointG.getOctets();
   } else {
     throw new IllegalArgumentException("Base Point G already set");
   }
 }
  ECDSAPublicKey(ASN1Sequence seq) throws IllegalArgumentException {
    Enumeration en = seq.getObjects();

    this.usage = ASN1ObjectIdentifier.getInstance(en.nextElement());

    options = 0;
    while (en.hasMoreElements()) {
      Object obj = en.nextElement();

      if (obj instanceof ASN1TaggedObject) {
        ASN1TaggedObject to = (ASN1TaggedObject) obj;
        switch (to.getTagNo()) {
          case 0x1:
            setPrimeModulusP(UnsignedInteger.getInstance(to).getValue());
            break;
          case 0x2:
            setFirstCoefA(UnsignedInteger.getInstance(to).getValue());
            break;
          case 0x3:
            setSecondCoefB(UnsignedInteger.getInstance(to).getValue());
            break;
          case 0x4:
            setBasePointG(ASN1OctetString.getInstance(to, false));
            break;
          case 0x5:
            setOrderOfBasePointR(UnsignedInteger.getInstance(to).getValue());
            break;
          case 0x6:
            setPublicPointY(ASN1OctetString.getInstance(to, false));
            break;
          case 0x7:
            setCofactorF(UnsignedInteger.getInstance(to).getValue());
            break;
          default:
            options = 0;
            throw new IllegalArgumentException("Unknown Object Identifier!");
        }
      } else {
        throw new IllegalArgumentException("Unknown Object Identifier!");
      }
    }
    if (options != 0x20 && options != 0x7F) {
      throw new IllegalArgumentException("All options must be either present or absent!");
    }
  }
  /**
   * Create a SubjectPublicKeyInfo public key.
   *
   * @param publicKey the SubjectPublicKeyInfo encoding
   * @return the appropriate key parameter
   * @throws java.io.IOException on an error encoding the key
   */
  public static SubjectPublicKeyInfo createSubjectPublicKeyInfo(AsymmetricKeyParameter publicKey)
      throws IOException {
    if (publicKey instanceof RSAKeyParameters) {
      RSAKeyParameters pub = (RSAKeyParameters) publicKey;

      return new SubjectPublicKeyInfo(
          new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE),
          new RSAPublicKey(pub.getModulus(), pub.getExponent()));
    } else if (publicKey instanceof DSAPublicKeyParameters) {
      DSAPublicKeyParameters pub = (DSAPublicKeyParameters) publicKey;

      return new SubjectPublicKeyInfo(
          new AlgorithmIdentifier(X9ObjectIdentifiers.id_dsa), new ASN1Integer(pub.getY()));
    } else if (publicKey instanceof ECPublicKeyParameters) {
      ECPublicKeyParameters pub = (ECPublicKeyParameters) publicKey;
      ECDomainParameters domainParams = pub.getParameters();
      ASN1Encodable params;

      if (domainParams == null) {
        params = new X962Parameters(DERNull.INSTANCE); // Implicitly CA
      } else if (domainParams instanceof ECNamedDomainParameters) {
        params = new X962Parameters(((ECNamedDomainParameters) domainParams).getName());
      } else {
        X9ECParameters ecP =
            new X9ECParameters(
                domainParams.getCurve(),
                domainParams.getG(),
                domainParams.getN(),
                domainParams.getH(),
                domainParams.getSeed());

        params = new X962Parameters(ecP);
      }

      ASN1OctetString p = (ASN1OctetString) new X9ECPoint(pub.getQ()).toASN1Primitive();

      return new SubjectPublicKeyInfo(
          new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, params), p.getOctets());
    } else {
      throw new IOException("key parameters not recognised.");
    }
  }