public BigInteger[] decode(BigInteger n, byte[] encoding) throws IOException { ASN1Sequence seq = (ASN1Sequence)ASN1Primitive.fromByteArray(encoding); if (seq.size() == 2) { BigInteger r = decodeValue(n, seq, 0); BigInteger s = decodeValue(n, seq, 1); byte[] expectedEncoding = encode(n, r, s); if (Arrays.areEqual(expectedEncoding, encoding)) { return new BigInteger[]{ r, s }; } } throw new IllegalArgumentException("Malformed signature"); }
public byte[] encode(BigInteger n, BigInteger r, BigInteger s) throws IOException { ASN1EncodableVector v = new ASN1EncodableVector(); encodeValue(n, v, r); encodeValue(n, v, s); return new DERSequence(v).getEncoded(ASN1Encoding.DER); }
protected void encodeValue(BigInteger n, ASN1EncodableVector v, BigInteger x) { v.add(new ASN1Integer(checkValue(n, x))); } }
protected BigInteger decodeValue(BigInteger n, ASN1Sequence s, int pos) { return checkValue(n, ((ASN1Integer)s.getObjectAt(pos)).getValue()); }