/** * XMSSMT constructor... * * @param height Height of tree. * @param layers Amount of layers. * @param digest Digest to use. */ public XMSSMTParameters(int height, int layers, Digest digest) { super(); this.height = height; this.layers = layers; this.xmssParams = new XMSSParameters(xmssTreeHeight(height, layers), digest); oid = DefaultXMSSMTOid.lookup(getDigest().getAlgorithmName(), getDigestSize(), getWinternitzParameter(), getLen(), getHeight(), layers); /* * if (oid == null) { throw new InvalidParameterException(); } */ }
public byte[] toByteArray() { /* index || random || reduced signatures */ int n = params.getDigestSize(); int len = params.getWOTSPlus().getParams().getLen(); int indexSize = (int)Math.ceil(params.getHeight() / (double)8); int randomSize = n; int reducedSignatureSizeSingle = ((params.getHeight() / params.getLayers()) + len) * n; int reducedSignaturesSizeTotal = reducedSignatureSizeSingle * params.getLayers(); int totalSize = indexSize + randomSize + reducedSignaturesSizeTotal; byte[] out = new byte[totalSize]; int position = 0; /* copy index */ byte[] indexBytes = XMSSUtil.toBytesBigEndian(index, indexSize); XMSSUtil.copyBytesAtOffset(out, indexBytes, position); position += indexSize; /* copy random */ XMSSUtil.copyBytesAtOffset(out, random, position); position += randomSize; /* copy reduced signatures */ for (XMSSReducedSignature reducedSignature : reducedSignatures) { byte[] signature = reducedSignature.toByteArray(); XMSSUtil.copyBytesAtOffset(out, signature, position); position += reducedSignatureSizeSingle; } return out; }
public void init(boolean forSigning, CipherParameters param) { if (forSigning) { initSign = true; hasGenerated = false; privateKey = (XMSSMTPrivateKeyParameters)param; nextKeyGenerator = privateKey; params = privateKey.getParameters(); xmssParams = params.getXMSSParameters(); } else { initSign = false; publicKey = (XMSSMTPublicKeyParameters)param; params = publicKey.getParameters(); xmssParams = params.getXMSSParameters(); } wotsPlus = new WOTSPlus(new WOTSPlusParameters(params.getDigest())); }
private XMSSMTPrivateKeyParameters(Builder builder) super(true, builder.params.getDigest().getAlgorithmName()); params = builder.params; if (params == null) int n = params.getDigestSize(); byte[] privateKey = builder.privateKey; if (privateKey != null) int totalHeight = params.getHeight(); int indexSize = (totalHeight + 7) / 8; int secretKeySize = n; int totalHeight = params.getHeight();
final int totalHeight = params.getHeight(); final int xmssHeight = xmssParams.getHeight(); if (!XMSSUtil.isIndexValid(totalHeight, globalIndex)) XMSSUtil.toBytesBigEndian(globalIndex, params.getDigestSize())); byte[] messageDigest = wotsPlus.getKhf().HMsg(concatenated, message); wotsPlus.importKeys(new byte[params.getDigestSize()], privateKey.getPublicSeed()); for (int layer = 1; layer < params.getLayers(); layer++)
XMSSUtil.toBytesBigEndian(sig.getIndex(), params.getDigestSize())); byte[] messageDigest = wotsPlus.getKhf().HMsg(concatenated, message); wotsPlus.importKeys(new byte[params.getDigestSize()], publicKey.getPublicSeed()); for (int layer = 1; layer < params.getLayers(); layer++)
public byte[] toByteArray() int n = params.getDigestSize(); int indexSize = (params.getHeight() + 7) / 8; int secretKeySize = n; int secretKeyPRFSize = n;
AlgorithmIdentifier algorithmIdentifier = new AlgorithmIdentifier(PQCObjectIdentifiers.xmss_mt, new XMSSMTKeyParams(keyParams.getParameters().getHeight(), keyParams.getParameters().getLayers(), Utils.xmssLookupTreeAlgID(keyParams.getTreeDigest()))); return new SubjectPublicKeyInfo(algorithmIdentifier, new XMSSMTPublicKey(keyParams.getPublicSeed(), keyParams.getRoot()));
private XMSSMTPublicKeyParameters(Builder builder) super(false, builder.params.getDigest().getAlgorithmName()); params = builder.params; if (params == null) int n = params.getDigestSize(); byte[] publicKey = builder.publicKey; if (publicKey != null)
private void importState(XMSSMTPrivateKeyParameters privateKey, XMSSMTPublicKeyParameters publicKey) { /* import to xmss */ xmssParams.getWOTSPlus().importKeys(new byte[params.getDigestSize()], this.privateKey.getPublicSeed()); this.privateKey = privateKey; this.publicKey = publicKey; }
private void updateState(XMSSMTParameters params, long globalIndex, byte[] publicSeed, byte[] secretKeySeed) XMSSParameters xmssParams = params.getXMSSParameters(); int xmssHeight = xmssParams.getHeight(); for (int layer = 1; layer < params.getLayers(); layer++) this.put(layer, new BDS(params.getXMSSParameters(), publicSeed, secretKeySeed, otsHashAddress));
param = new XMSSMTKeyGenerationParameters(new XMSSMTParameters(xmssParams.getHeight(), xmssParams.getLayers(), new SHA256Digest()), random); param = new XMSSMTKeyGenerationParameters(new XMSSMTParameters(xmssParams.getHeight(), xmssParams.getLayers(), new SHA512Digest()), random); param = new XMSSMTKeyGenerationParameters(new XMSSMTParameters(xmssParams.getHeight(), xmssParams.getLayers(), new SHAKEDigest(128)), random); param = new XMSSMTKeyGenerationParameters(new XMSSMTParameters(xmssParams.getHeight(), xmssParams.getLayers(), new SHAKEDigest(256)), random);
public int getHeight() { return keyParams.getParameters().getHeight(); }
public void init( KeyGenerationParameters param) { XMSSMTKeyGenerationParameters parameters = (XMSSMTKeyGenerationParameters)param; prng = parameters.getRandom(); this.params = parameters.getParameters(); this.xmssParams = params.getXMSSParameters(); }
public int getLayers() { return keyParams.getParameters().getLayers(); }
/** * Generate a new XMSSMT private key / public key pair. */ public AsymmetricCipherKeyPair generateKeyPair() { XMSSMTPrivateKeyParameters privateKey; XMSSMTPublicKeyParameters publicKey; /* generate XMSSMT private key */ privateKey = generatePrivateKey(new XMSSMTPrivateKeyParameters.Builder(params).build().getBDSState()); /* import to xmss */ xmssParams.getWOTSPlus().importKeys(new byte[params.getDigestSize()], privateKey.getPublicSeed()); /* get root */ int rootLayerIndex = params.getLayers() - 1; OTSHashAddress otsHashAddress = (OTSHashAddress)new OTSHashAddress.Builder().withLayerAddress(rootLayerIndex) .build(); /* store BDS instance of root xmss instance */ BDS bdsRoot = new BDS(xmssParams, privateKey.getPublicSeed(), privateKey.getSecretKeySeed(), otsHashAddress); XMSSNode root = bdsRoot.getRoot(); privateKey.getBDSState().put(rootLayerIndex, bdsRoot); /* set XMSS^MT root / create public key */ privateKey = new XMSSMTPrivateKeyParameters.Builder(params).withSecretKeySeed(privateKey.getSecretKeySeed()) .withSecretKeyPRF(privateKey.getSecretKeyPRF()).withPublicSeed(privateKey.getPublicSeed()) .withRoot(root.getValue()).withBDSState(privateKey.getBDSState()).build(); publicKey = new XMSSMTPublicKeyParameters.Builder(params).withRoot(root.getValue()) .withPublicSeed(privateKey.getPublicSeed()).build(); return new AsymmetricCipherKeyPair(publicKey, privateKey); }
int n = keyParams.getParameters().getDigestSize(); int totalHeight = keyParams.getParameters().getHeight(); int indexSize = (totalHeight + 7) / 8; int secretKeySize = n;
public byte[] toByteArray() { /* oid || root || seed */ int n = params.getDigestSize(); // int oidSize = 4; int rootSize = n; int publicSeedSize = n; int totalSize = rootSize + publicSeedSize; // int totalSize = oidSize + rootSize + publicSeedSize; byte[] out = new byte[totalSize]; int position = 0; /* copy oid */ /* * XMSSUtil.intToBytesBigEndianOffset(out, oid, position); position += * oidSize; */ /* copy root */ XMSSUtil.copyBytesAtOffset(out, root, position); position += rootSize; /* copy public seed */ XMSSUtil.copyBytesAtOffset(out, publicSeed, position); return out; }
public KeyPair generateKeyPair() { if (!initialised) { param = new XMSSMTKeyGenerationParameters(new XMSSMTParameters(10, 20, new SHA512Digest()), random); engine.init(param); initialised = true; } AsymmetricCipherKeyPair pair = engine.generateKeyPair(); XMSSMTPublicKeyParameters pub = (XMSSMTPublicKeyParameters)pair.getPublic(); XMSSMTPrivateKeyParameters priv = (XMSSMTPrivateKeyParameters)pair.getPrivate(); return new KeyPair(new BCXMSSMTPublicKey(treeDigest, pub), new BCXMSSMTPrivateKey(treeDigest, priv)); } }