Go to the documentation of this file.
32 #define TRACE_LEVEL ACME_TRACE_LEVEL
39 #include "jansson_private.h"
43 #if (ACME_CLIENT_SUPPORT == ENABLED)
56 size_t *written,
bool_t sort)
58 #if (ACME_CLIENT_RSA_SUPPORT == ENABLED)
74 rootObj = json_object();
81 ret = json_object_set_new(rootObj,
"kty", json_string(
"RSA"));
91 error =
mpiExport(&publicKey->
n, (uint8_t *) buffer,
n,
102 ret = json_object_set_new(rootObj,
"n", json_string(buffer));
111 error =
mpiExport(&publicKey->
e, (uint8_t *) buffer,
n,
122 ret = json_object_set_new(rootObj,
"e", json_string(buffer));
129 flags = sort ? (JSON_COMPACT | JSON_SORT_KEYS) : JSON_COMPACT;
132 s = json_dumps(rootObj,
flags);
155 json_decref(rootObj);
176 size_t *written,
bool_t sort)
178 #if (ACME_CLIENT_ECDSA_SUPPORT == ENABLED)
195 rootObj = json_object();
201 if(publicKey->
curve == NULL)
206 ret = json_object_set_new(rootObj,
"kty", json_string(
"EC"));
235 ret |= json_object_set_new(rootObj,
"crv", json_string(crv));
254 ret = json_object_set_new(rootObj,
"x", json_string(buffer));
273 ret = json_object_set_new(rootObj,
"y", json_string(buffer));
280 flags = sort ? (JSON_COMPACT | JSON_SORT_KEYS) : JSON_COMPACT;
283 s = json_dumps(rootObj,
flags);
306 json_decref(rootObj);
327 size_t *written,
bool_t sort)
329 #if (ACME_CLIENT_ED25519_SUPPORT == ENABLED || \
330 ACME_CLIENT_ED448_SUPPORT == ENABLED)
347 rootObj = json_object();
353 if(publicKey->
curve == NULL)
357 ret = json_object_set_new(rootObj,
"kty", json_string(
"OKP"));
380 ret |= json_object_set_new(rootObj,
"crv", json_string(crv));
396 ret = json_object_set_new(rootObj,
"x", json_string(buffer));
403 flags = sort ? (JSON_COMPACT | JSON_SORT_KEYS) : JSON_COMPACT;
406 s = json_dumps(rootObj,
flags);
429 json_decref(rootObj);
456 const void *privateKey,
char_t *buffer,
size_t *written)
479 rootObj = json_object();
492 ret = json_object_set_new(rootObj,
"protected", json_string(
p));
509 ret = json_object_set_new(rootObj,
"payload", json_string(
p));
523 buffer,
n, (uint8_t *) buffer, &
n);
533 ret = json_object_set_new(rootObj,
"signature", json_string(buffer));
539 s = json_dumps(rootObj, JSON_COMPACT);
566 json_decref(rootObj);
587 const char_t *alg,
const void *privateKey,
const char_t *input,
588 size_t inputLen, uint8_t *output,
size_t *outputLen)
592 #if (ACME_CLIENT_RSA_SUPPORT == ENABLED)
606 else if(
osStrcmp(alg,
"RS384") == 0)
611 else if(
osStrcmp(alg,
"RS512") == 0)
626 error = hashAlgo->
compute(input, inputLen, digest);
644 #if (ACME_CLIENT_ECDSA_SUPPORT == ENABLED)
662 else if(
osStrcmp(alg,
"ES384") == 0)
667 else if(
osStrcmp(alg,
"ES512") == 0)
682 error = hashAlgo->
compute(input, inputLen, digest);
716 #if (ACME_CLIENT_ED25519_SUPPORT == ENABLED || \
717 ACME_CLIENT_ED448_SUPPORT == ENABLED)
728 q = (eddsaPrivateKey->
q.
curve != NULL) ? eddsaPrivateKey->
q.
q : NULL;
747 #if (ACME_CLIENT_ED448_SUPPORT == ENABLED)
__weak_func error_t ecdsaGenerateSignature(const PrngAlgo *prngAlgo, void *prngContext, const EcPrivateKey *privateKey, const uint8_t *digest, size_t digestLen, EcdsaSignature *signature)
ECDSA signature generation.
@ EC_PUBLIC_KEY_FORMAT_RAW_Y
uint8_t d[EDDSA_MAX_PRIVATE_KEY_LEN]
Private key.
const EcCurve * curve
Elliptic curve parameters.
error_t eddsaExportPublicKey(const EddsaPublicKey *key, uint8_t *data, size_t *length)
Export an EdDSA public key.
error_t jwkExportRsaPublicKey(const RsaPublicKey *publicKey, char_t *buffer, size_t *written, bool_t sort)
Export an RSA public key to JWK format.
#define ED448_SIGNATURE_LEN
error_t jwkExportEcPublicKey(const EcPublicKey *publicKey, char_t *buffer, size_t *written, bool_t sort)
Export an EC public key to JWK format.
#define ED25519_SIGNATURE_LEN
#define ACME_CLIENT_ED25519_SUPPORT
JOSE (JSON Object Signing and Encryption)
error_t ecdsaExportSignature(const EcdsaSignature *signature, uint8_t *data, size_t *length, EcdsaSignatureFormat format)
Export an ECDSA signature.
void ecdsaFreeSignature(EcdsaSignature *signature)
Release an ECDSA signature.
error_t ed25519GenerateSignature(const uint8_t *privateKey, const uint8_t *publicKey, const void *message, size_t messageLen, const void *context, uint8_t contextLen, uint8_t flag, uint8_t *signature)
EdDSA signature generation.
uint8_t q[EDDSA_MAX_PUBLIC_KEY_LEN]
Public key.
const EcCurve * curve
Elliptic curve parameters.
void base64urlEncode(const void *input, size_t inputLen, char_t *output, size_t *outputLen)
Base64url encoding algorithm.
error_t jwsGenerateSignature(const PrngAlgo *prngAlgo, void *prngContext, const char_t *alg, const void *privateKey, const char_t *input, size_t inputLen, uint8_t *output, size_t *outputLen)
Compute JWS signature using the specified algorithm.
@ ERROR_FAILURE
Generic error code.
void ecdsaInitSignature(EcdsaSignature *signature)
Initialize an ECDSA signature.
@ ECDSA_SIGNATURE_FORMAT_RAW
Base64url encoding scheme.
error_t mpiExport(const Mpi *a, uint8_t *output, size_t length, MpiFormat format)
Integer to octet string conversion.
error_t jwkExportEddsaPublicKey(const EddsaPublicKey *publicKey, char_t *buffer, size_t *written, bool_t sort)
Export an EdDSA public key to JWK format.
error_t ecExportPublicKey(const EcPublicKey *key, uint8_t *data, size_t *length, EcPublicKeyFormat format)
Export an EC public key.
@ ERROR_INVALID_SIGNATURE_ALGO
@ EC_PUBLIC_KEY_FORMAT_RAW_X
EddsaPublicKey q
Public key.
Common interface for hash algorithms.
error_t rsassaPkcs1v15Sign(const RsaPrivateKey *key, const HashAlgo *hash, const uint8_t *digest, uint8_t *signature, size_t *signatureLen)
RSASSA-PKCS1-v1_5 signature generation operation.
error_t jwsCreate(const PrngAlgo *prngAlgo, void *prngContext, const char_t *protected, const char_t *payload, const char_t *alg, const void *privateKey, char_t *buffer, size_t *written)
Create a JSON Web Signature.
const EcCurve * curve
Elliptic curve parameters.
ACME client (Automatic Certificate Management Environment)
error_t ed448GenerateSignature(const uint8_t *privateKey, const uint8_t *publicKey, const void *message, size_t messageLen, const void *context, uint8_t contextLen, uint8_t flag, uint8_t *signature)
EdDSA signature generation.
#define SHA512_DIGEST_SIZE
uint_t mpiGetByteLength(const Mpi *a)
Get the actual length in bytes.