/** * Generate a new XMSSMT private key / public key pair. */ public void generateKeys() { XMSSMTKeyPairGenerator kpGen = new XMSSMTKeyPairGenerator(); kpGen.init(new XMSSMTKeyGenerationParameters(getParams(), prng)); AsymmetricCipherKeyPair kp = kpGen.generateKeyPair(); privateKey = (XMSSMTPrivateKeyParameters)kp.getPrivate(); publicKey = (XMSSMTPublicKeyParameters)kp.getPublic(); importState(privateKey, publicKey); }
/** * Sign message. * * @param message Message to sign. * @return XMSSMT signature on digest of message. */ public byte[] sign(byte[] message) { if (message == null) { throw new NullPointerException("message == null"); } XMSSMTSigner signer = new XMSSMTSigner(); signer.init(true, privateKey); byte[] signature = signer.generateSignature(message); privateKey = (XMSSMTPrivateKeyParameters)signer.getUpdatedPrivateKey(); importState(privateKey, publicKey); return signature; }
/** * Verify an XMSSMT signature. * * @param message Message. * @param signature XMSSMT signature. * @param publicKey XMSSMT public key. * @return true if signature is valid false else. * @throws ParseException */ public boolean verifySignature(byte[] message, byte[] signature, byte[] publicKey) throws ParseException { if (message == null) { throw new NullPointerException("message == null"); } if (signature == null) { throw new NullPointerException("signature == null"); } if (publicKey == null) { throw new NullPointerException("publicKey == null"); } XMSSMTSigner signer = new XMSSMTSigner(); signer.init(false, new XMSSMTPublicKeyParameters.Builder(getParams()).withPublicKey(publicKey).build()); return signer.verifySignature(message, signature); }