title: Java - Create XML Digital Signature using ECDSA (Elliptic Curve)
body: <p>We can create XML Digital Signature using RSA keys. But how do I use elliptic curve keys to sign xml files ? I get error messages such as -</p>
  
  <pre><code>Exception in thread "main" java.security.KeyException: ECKeyValue not supported
      at org.jcp.xml.dsig.internal.dom.DOMKeyValue$EC.&lt;init&gt;(DOMKeyValue.java:350)
      at org.jcp.xml.dsig.internal.dom.DOMKeyInfoFactory.newKeyValue(DOMKeyInfoFactory.java:71)
      at csr.ExtractEC.main(XMLSignatureECTest.java:57)
  Caused by: java.lang.ClassNotFoundException: sun/security/ec/ECParameters
      at java.lang.Class.forName0(Native Method)
      at java.lang.Class.forName(Class.java:264)
      at org.jcp.xml.dsig.internal.dom.DOMKeyValue$EC.getMethods(DOMKeyValue.java:367)
      at org.jcp.xml.dsig.internal.dom.DOMKeyValue$EC$1.run(DOMKeyValue.java:343)
      at org.jcp.xml.dsig.internal.dom.DOMKeyValue$EC$1.run(DOMKeyValue.java:339)
      at java.security.AccessController.doPrivileged(Native Method)
      at org.jcp.xml.dsig.internal.dom.DOMKeyValue$EC.&lt;init&gt;(DOMKeyValue.java:338)
      ... 2 more
  </code></pre>
  
  <p>I used below code to create SignatureMethod and KeyInfo -</p>
  
  <pre><code>String url = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256";
          SignatureMethod signatureMethod = factory.newSignatureMethod(url, null);
          SignedInfo signedInfo = factory.newSignedInfo(c14n, signatureMethod, Collections.singletonList(reference));
  
          PrivateKey privateKey = Utils.generatePrivateEC("e:\\certs\\ec\\ec.key.p8");
          Certificate certificate = Utils.generatePublic("e:\\certs\\ec\\ec.cer");
          KeyInfoFactory keyInfoFactory = factory.getKeyInfoFactory();
          KeyValue keyValue = keyInfoFactory.newKeyValue(certificate.getPublicKey());
          KeyInfo keyInfo = keyInfoFactory.newKeyInfo(Collections.singletonList(keyValue));
  </code></pre>
  
  <p>JDK - Oracle JDK 8
  Security Providers - BouncyCastle and Sun.</p>