hello,

i have been trying to use JSS in my project, but i'm having issues using the 
java Signature class to sign. the issue i'm having is that i can't call 
Signature.sign() more than once after i call Signature.init(). it fails on 
Signature.update() call after i do Signature.sign(). this is the stack trace

java.security.SignatureException: Signature is not initialized
        at 
org.mozilla.jss.pkcs11.PK11Signature.engineUpdate(PK11Signature.java:219)
        at org.mozilla.jss.crypto.Signature.update(Signature.java:197)
        at 
org.mozilla.jss.provider.java.security.JSSSignatureSpi.engineUpdate(JSSSignatureSpi.java:145)
        at java.security.Signature$Delegate.engineUpdate(Signature.java:1118)
        at java.security.Signature.update(Signature.java:684)
        at java.security.Signature.update(Signature.java:667)

according to the javadocs for Signature.sign() i should be able to call 
Signature.update() again after i call Signature.sign(), but that doesn't seem 
to be the case. 

Signature.sign() - "A call to this method resets this signature object to the 
state it was in when previously initialized for signing via a call to 
initSign(PrivateKey). That is, the object is reset and available to generate 
another signature from the same signer, if desired, via new calls to update and 
sign. "

here is some sample code to show the behavior i am seeing. to run it, you have 
to initialize the database in new File("signature-cache/dbfile") and the 
password file new File("signature-cache/password").

public static void main(String[] args) throws KeyDatabaseException, 
CertDatabaseException,
      AlreadyInitializedException, GeneralSecurityException, 
NotInitializedException,
      IOException {
    CryptoManager.InitializationValues vals = new 
CryptoManager.InitializationValues(new File(
        "signature-cache/signature-db").getAbsolutePath());
    vals.removeSunProvider = true;
    CryptoManager.initialize(vals);

    CryptoManager manager = CryptoManager.getInstance();
    manager.setPasswordCallback(new FilePasswordCallback(new 
File("signature-cache/password")
        .getAbsolutePath()));

    KeyPairGenerator kpgen = KeyPairGenerator.getInstance("DSA");
    kpgen.initialize(1024);
    KeyPair keyPair = kpgen.generateKeyPair();
    Signature signer = Signature.getInstance("SHA-1/DSA");

    // init
    signer.initSign(keyPair.getPrivate());

    // sign
    signer.update("foo".getBytes());
    signer.sign();
    System.out.println("signed foo");

    // sign again, and should let me update
    signer.update("bar".getBytes()); // this is where it fails
    signer.sign();
    System.out.println("signed bar");
  }


i looked at the source code for PK11Signature.engineSign() at 
http://mxr.mozilla.org/mozilla/source/security/jss/org/mozilla/jss/pkcs11/PK11Signature.java,
 and it looks like it is setting the state=UNINITIALIZED and sigContext=null 
after signing. is this intentional? it doesn't seem to match the expected 
behavior of the Signature class.
-- 
dev-tech-crypto mailing list
dev-tech-crypto@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-tech-crypto

Reply via email to