Example usage for org.bouncycastle.crypto.params ECNamedDomainParameters ECNamedDomainParameters

List of usage examples for org.bouncycastle.crypto.params ECNamedDomainParameters ECNamedDomainParameters

Introduction

In this page you can find the example usage for org.bouncycastle.crypto.params ECNamedDomainParameters ECNamedDomainParameters.

Prototype

public ECNamedDomainParameters(ASN1ObjectIdentifier name, ECCurve curve, ECPoint G, BigInteger n, BigInteger h,
            byte[] seed) 

Source Link

Usage

From source file:org.jruby.ext.openssl.PKeyEC.java

License:Open Source License

@JRubyMethod(name = "dsa_sign_asn1")
public IRubyObject dsa_sign_asn1(final ThreadContext context, final IRubyObject data) {
    try {// w w w  .j  a  v  a  2s. co m
        ECNamedCurveParameterSpec params = ECNamedCurveTable.getParameterSpec(getCurveName());
        ASN1ObjectIdentifier oid = getCurveOID(getCurveName());
        ECNamedDomainParameters domainParams = new ECNamedDomainParameters(oid, params.getCurve(),
                params.getG(), params.getN(), params.getH(), params.getSeed());

        final ECDSASigner signer = new ECDSASigner();
        final ECPrivateKey privKey = (ECPrivateKey) this.privateKey;
        signer.init(true, new ECPrivateKeyParameters(privKey.getS(), domainParams));

        final byte[] message = data.convertToString().getBytes();
        BigInteger[] signature = signer.generateSignature(message); // [r, s]

        //            final byte[] r = signature[0].toByteArray();
        //            final byte[] s = signature[1].toByteArray();
        //            // ASN.1 encode as: 0x30 len 0x02 rlen (r) 0x02 slen (s)
        //            final int len = 1 + (1 + r.length) + 1 + (1 + s.length);
        //
        //            final byte[] encoded = new byte[1 + 1 + len]; int i;
        //            encoded[0] = 0x30;
        //            encoded[1] = (byte) len;
        //            encoded[2] = 0x20;
        //            encoded[3] = (byte) r.length;
        //            System.arraycopy(r, 0, encoded, i = 4, r.length); i += r.length;
        //            encoded[i++] = 0x20;
        //            encoded[i++] = (byte) s.length;
        //            System.arraycopy(s, 0, encoded, i, s.length);

        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        ASN1OutputStream asn1 = new ASN1OutputStream(bytes);

        ASN1EncodableVector v = new ASN1EncodableVector();
        v.add(new ASN1Integer(signature[0])); // r
        v.add(new ASN1Integer(signature[1])); // s

        asn1.writeObject(new DLSequence(v));

        return StringHelper.newString(context.runtime, bytes.buffer(), bytes.size());
    } catch (IOException ex) {
        throw newECError(context.runtime, ex.toString());
    } catch (RuntimeException ex) {
        throw newECError(context.runtime, ex.toString());
    }
}