Skip to main content

PQC - Seed import

PQC-SKA

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

{
"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

Sign a Payload

POST: /v1/synchronousSign

Description: Sign request, the payload (message to be signed) must be base64-encoded.

Signing-Algorithms

The signatureAlgorithm is: ML_DSA, SLH_DSA

{
"signRequest": {
"payload": "U29tZVBheWxvYWQ=",
"payloadType": "UNSPECIFIED",
"signKeyName": "pqc_mldsa_fips204_final",
"keyPassword": null,
"signatureAlgorithm": "ML_DSA"
}
}

Supported Algorithms: ML_DSA

Signature Size
AlgorithmRAW signature (Bytes)Base64-Encoded (Bytes)
ML-DSA-4424203228
ML-DSA-6533094412
ML-DSA-8746276172

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

{
"verifySignatureRequest": {
"signKeyName": "pqc_mldsa_fips204_final",
"signatureAlgorithm": "ML_DSA",
"payload": "U29tZVBheWxvYWQ=",
"signature": "m2MX/8Murbk0rCWz5OD/3PtYoZbMDZkdTYH/BgWv7KCu8FVQJ7rhRNp/OlS9aNbCXSYzJmD...."
}
}

Response

{
"signatureValid": true
}

Local Verify (BouncyCastle)

Public-Key

The publicKey can be retrieved by fetching the key-attributes.

  • POST /v1/key/attributes
/*
* 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);
}
}