PQC - Seed import
PQC algorithms do support Securosys Smart Key Attributes, following the same principles. Click here
Seed import PQC-Key
POST: /v1/importedKey
Description: Import key from a seed
- ML-DSA (FIPS 204)
- SLH-DSA (FIPS 205)
{
"label": "pqc_mldsa_fips204_final",
"algorithm": "ML-DSA-65",
"seed": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8=",
"addressFormat": null,
"curveOid": null,
"attributes": {
"sign": true,
"decrypt": false,
"unwrap": false,
"extractable": false,
"modifiable": true,
"destroyable": true,
"sensitive": true
},
"policy": null
}
Supported Algorithms: ML-DSA-44, ML-DSA-65, ML-DSA-87
- SLH-DSA-SHAx-128: 'seed' must be 48 (3x16) bytes long
- SLH-DSA-SHAx-192: 'seed' must be 72 (3x24) bytes long.
- SLH-DSA-SHAx-256: 'seed' must be 96 (3x32) bytes long.
{
"label": "pqc_slhdsa_fips204_final",
"algorithm": "SLH-DSA-SHA2-256f",
"seed": "J5pUkr0oB8ivtqAb1vk3K2ScKmvbUoi3lgNCJOT9MSxOHWVLH8jYtxwSuJVa2E+tKTCASeTQuRjEzlOcGN/5RzBMxxQRQgj/iwxtfV7RhPOJ81Q8VQNDyFd0qdvhhMlx",
"addressFormat": null,
"curveOid": null,
"attributes": {
"sign": true,
"decrypt": false,
"unwrap": false,
"extractable": false,
"modifiable": true,
"destroyable": true,
"sensitive": true
},
"policy": null
}
Supported Algorithms: SLH-DSA-SHA2-128s, SLH-DSA-SHA2-128f, SLH-DSA-SHA2-192s, SLH-DSA-SHA2-192f, SLH-DSA-SHA2-256s, SLH-DSA-SHA2-256f, SLH-DSA-SHAKE-128s, SLH-DSA-SHAKE-128f, SLH-DSA-SHAKE-192s, SLH-DSA-SHAKE-192f, SLH-DSA-SHAKE-256s, SLH-DSA-SHAKE-256f
Sign a Payload
POST: /v1/synchronousSign
Description: Sign request, the payload (message to be signed) must be base64-encoded.
The signatureAlgorithm
is: ML_DSA, SLH_DSA
- ML_DSA (FIPS 204)
- SLH_DSA (FIPS 205)
{
"signRequest": {
"payload": "U29tZVBheWxvYWQ=",
"payloadType": "UNSPECIFIED",
"signKeyName": "pqc_mldsa_fips204_final",
"keyPassword": null,
"signatureAlgorithm": "ML_DSA"
}
}
Supported Algorithms: ML_DSA
Signature Size
Algorithm | RAW signature (Bytes) | Base64-Encoded (Bytes) |
---|---|---|
ML-DSA-44 | 2420 | 3228 |
ML-DSA-65 | 3309 | 4412 |
ML-DSA-87 | 4627 | 6172 |
{
"signRequest": {
"payload": "U29tZVBheWxvYWQ=",
"payloadType": "UNSPECIFIED",
"signKeyName": "pqc_slhdsa_fips204_final",
"keyPassword": null,
"signatureAlgorithm": "SLH_DSA"
}
}
Supported Algorithms: SLH_DSA
Signature Size
Algorithm | RAW signature (Bytes) | Base64-Encoded (Bytes) |
---|---|---|
SLH-DSA-SHA2-128f | 17088 | 22784 |
SLH-DSA-SHA2-192f | 35664 | 47552 |
SLH-DSA-SHA2-256f | 49856 | 66476 |
SLH-DSA-SHAKE-128f | 17088 | 22784 |
SLH-DSA-SHAKE-192f | 35664 | 47552 |
SLH-DSA-SHAKE-256f | 49856 | 66476 |
Response (ML-DSA):
{
"signature": "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"
}
Verify
POST: /v1/verify
Description Verify signature of a payload
Replace the signature
from the previous response with the payload
- ML-DSA (FIPS 204)
- SLH-DSA (FIPS 205)
{
"verifySignatureRequest": {
"signKeyName": "pqc_mldsa_fips204_final",
"signatureAlgorithm": "ML_DSA",
"payload": "U29tZVBheWxvYWQ=",
"signature": "m2MX/8Murbk0rCWz5OD/3PtYoZbMDZkdTYH/BgWv7KCu8FVQJ7rhRNp/OlS9aNbCXSYzJmD...."
}
}
{
"verifySignatureRequest": {
"signKeyName": "pqc_slhdsa_fips204_final",
"signatureAlgorithm": "SLH_DSA",
"payload": "U29tZVBheWxvYWQ=",
"signature": "hmWYnbg7zvsW+CCmhDMX7hImTWQmeKmRxTr8UW5SZyRfIpGLvGkixWh2GVi/vMZ1ukJ0KVv...."
}
}
Response
{
"signatureValid": true
}
Local Verify (BouncyCastle)
The publicKey
can be retrieved by fetching the key-attributes.
- POST /v1/key/attributes
- ML-DSA (FIPS 204)
- SLH-DSA (FIPS 205)
/*
* Copyright (c)2015-2024, Securosys SA
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*/
import java.security.*;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
/**
* Illustrates ML-DSA/Dilithium signatures.
*/
public class VerifyMlDsaBcSample {
public static void main(final String... args) throws Exception {
final String base64Signature = "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";
final String payload = "U29tZVBheWxvYWQ=";
final String publicKey = "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";
Security.addProvider((Provider)Class.forName("org.bouncycastle.jce.provider.BouncyCastleProvider").getConstructor().newInstance());
final Provider provider = Security.getProvider("BC");
final String mlDsaSignatureAlgorithm = "ML-DSA";
final KeyFactory mlDsaKeyFactory = KeyFactory.getInstance(mlDsaSignatureAlgorithm, provider);
PublicKey mlDsaPublicKey = mlDsaKeyFactory.generatePublic(new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey)));
final Signature mlDsaSignature = Signature.getInstance(mlDsaSignatureAlgorithm, provider);
mlDsaSignature.initVerify(mlDsaPublicKey);
mlDsaSignature.update(Base64.getDecoder().decode(payload));
final boolean verified = mlDsaSignature.verify(Base64.getDecoder().decode(base64Signature));
System.out.println("verified: " + verified);
}
}
/*
* Copyright (c)2015-2024, Securosys SA
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*/
import java.security.*;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
/**
* Illustrates SLH-DSA/Sphincs+ signatures.
*/
public class VerifySlhDsaBcSample {
public static void main(final String... args) throws Exception {
final String base64Signature = "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";
final String payload = "U29tZVBheWxvYWQ=";
final String publicKey = "MDAwCwYJYIZIAWUDBAMVAyEAqglEBiJhMCfqdNC5nWbvCcSItS+EtF9QlD4/fOB9g2s=";
Security.addProvider((Provider)Class.forName("org.bouncycastle.jce.provider.BouncyCastleProvider").getConstructor().newInstance());
final Provider provider = Security.getProvider("BC");
final String slhDsaSignatureAlgorithm = "SLH-DSA";
final KeyFactory slhDsaKeyFactory = KeyFactory.getInstance(slhDsaSignatureAlgorithm, provider);
PublicKey slhDsaPublicKey = slhDsaKeyFactory.generatePublic(new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey)));
final Signature slhDsaSignature = Signature.getInstance(slhDsaSignatureAlgorithm, provider);
slhDsaSignature.initVerify(slhDsaPublicKey);
slhDsaSignature.update(Base64.getDecoder().decode(payload));
final boolean verified = slhDsaSignature.verify(Base64.getDecoder().decode(base64Signature));
System.out.println("verified: " + verified);
}
}