blob: 9401c8a0fc8f6b605d0381193300e7f684ef0f65 [file] [log] [blame]
package org.bouncycastle.pqc.jcajce.provider.gmss;
import java.security.PublicKey;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.pqc.asn1.GMSSPublicKey;
import org.bouncycastle.pqc.asn1.PQCObjectIdentifiers;
import org.bouncycastle.pqc.asn1.ParSet;
import org.bouncycastle.pqc.crypto.gmss.GMSSParameters;
import org.bouncycastle.pqc.crypto.gmss.GMSSPublicKeyParameters;
import org.bouncycastle.pqc.jcajce.provider.util.KeyUtil;
import org.bouncycastle.util.encoders.Hex;
/**
* This class implements the GMSS public key and is usually initiated by the <a
* href="GMSSKeyPairGenerator">GMSSKeyPairGenerator</a>.
*
* @see org.bouncycastle.pqc.crypto.gmss.GMSSKeyPairGenerator
*/
public class BCGMSSPublicKey
implements CipherParameters, PublicKey
{
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* The GMSS public key
*/
private byte[] publicKeyBytes;
/**
* The GMSSParameterSet
*/
private GMSSParameters gmssParameterSet;
private GMSSParameters gmssParams;
/**
* The constructor
*
* @param pub a raw GMSS public key
* @param gmssParameterSet an instance of GMSS Parameterset
* @see org.bouncycastle.pqc.crypto.gmss.GMSSKeyPairGenerator
*/
public BCGMSSPublicKey(byte[] pub, GMSSParameters gmssParameterSet)
{
this.gmssParameterSet = gmssParameterSet;
this.publicKeyBytes = pub;
}
public BCGMSSPublicKey(
GMSSPublicKeyParameters params)
{
this(params.getPublicKey(), params.getParameters());
}
/**
* Returns the name of the algorithm
*
* @return "GMSS"
*/
public String getAlgorithm()
{
return "GMSS";
}
/**
* @return The GMSS public key byte array
*/
public byte[] getPublicKeyBytes()
{
return publicKeyBytes;
}
/**
* @return The GMSS Parameterset
*/
public GMSSParameters getParameterSet()
{
return gmssParameterSet;
}
/**
* Returns a human readable form of the GMSS public key
*
* @return A human readable form of the GMSS public key
*/
public String toString()
{
String out = "GMSS public key : "
+ new String(Hex.encode(publicKeyBytes)) + "\n"
+ "Height of Trees: \n";
for (int i = 0; i < gmssParameterSet.getHeightOfTrees().length; i++)
{
out = out + "Layer " + i + " : "
+ gmssParameterSet.getHeightOfTrees()[i]
+ " WinternitzParameter: "
+ gmssParameterSet.getWinternitzParameter()[i] + " K: "
+ gmssParameterSet.getK()[i] + "\n";
}
return out;
}
public byte[] getEncoded()
{
return KeyUtil.getEncodedSubjectPublicKeyInfo(new AlgorithmIdentifier(PQCObjectIdentifiers.gmss, new ParSet(gmssParameterSet.getNumOfLayers(), gmssParameterSet.getHeightOfTrees(), gmssParameterSet.getWinternitzParameter(), gmssParameterSet.getK()).toASN1Primitive()), new GMSSPublicKey(publicKeyBytes));
}
public String getFormat()
{
return "X.509";
}
}