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(); }