public byte[] getEncoded() {
    SubjectPublicKeyInfo info;
    byte[] keyEnc = this.getY().toByteArray();
    byte[] keyBytes;

    if (keyEnc[0] == 0) {
      keyBytes = new byte[keyEnc.length - 1];
    } else {
      keyBytes = new byte[keyEnc.length];
    }

    for (int i = 0; i != keyBytes.length; i++) {
      keyBytes[i] = keyEnc[keyEnc.length - 1 - i]; // must be little endian
    }

    if (gost3410Spec instanceof GOST3410ParameterSpec) {
      if (gost3410Spec.getEncryptionParamSetOID() != null) {
        info =
            new SubjectPublicKeyInfo(
                new AlgorithmIdentifier(
                    CryptoProObjectIdentifiers.gostR3410_94,
                    new GOST3410PublicKeyAlgParameters(
                            new DERObjectIdentifier(gost3410Spec.getPublicKeyParamSetOID()),
                            new DERObjectIdentifier(gost3410Spec.getDigestParamSetOID()),
                            new DERObjectIdentifier(gost3410Spec.getEncryptionParamSetOID()))
                        .getDERObject()),
                new DEROctetString(keyBytes));
      } else {
        info =
            new SubjectPublicKeyInfo(
                new AlgorithmIdentifier(
                    CryptoProObjectIdentifiers.gostR3410_94,
                    new GOST3410PublicKeyAlgParameters(
                            new DERObjectIdentifier(gost3410Spec.getPublicKeyParamSetOID()),
                            new DERObjectIdentifier(gost3410Spec.getDigestParamSetOID()))
                        .getDERObject()),
                new DEROctetString(keyBytes));
      }
    } else {
      info =
          new SubjectPublicKeyInfo(
              new AlgorithmIdentifier(CryptoProObjectIdentifiers.gostR3410_94),
              new DEROctetString(keyBytes));
    }

    return info.getDEREncoded();
  }
 public int hashCode() {
   return y.hashCode() ^ gost3410Spec.hashCode();
 }