blob: beb922968a7393ba078c038f054dedc516017dd6 [file] [log] [blame]
// SPDX-License-Identifier: BSD-2-Clause
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
*
* LibTomCrypt is a library that provides various cryptographic
* algorithms in a highly modular and flexible manner.
*
* The library is free for all purposes without any express
* guarantee it works.
*/
#include "tomcrypt_private.h"
/**
@file ecc_ssh_ecdsa_encode_name.c
Curve/OID to SSH+ECDSA name string mapping per RFC5656
Russ Williams
*/
/**
Curve/OID to SSH+ECDSA name string mapping
@param buffer [out] The destination for the name
@param buflen [in/out] The max size and resulting size (including terminator) of the name
@param key A public or private ECC key
@return CRYPT_OK if successful
*/
int ecc_ssh_ecdsa_encode_name(char *buffer, unsigned long *buflen, const ecc_key *key)
{
char oidstr[64];
unsigned long oidlen = sizeof(oidstr);
unsigned long size = 0;
int err;
LTC_ARGCHK(buffer != NULL);
LTC_ARGCHK(buflen != NULL);
LTC_ARGCHK(key != NULL);
/* Get the OID of the curve */
if ((err = ecc_get_oid_str(oidstr, &oidlen, key)) != CRYPT_OK) goto error;
/* Check for three named curves: nistp256, nistp384, nistp521 */
if (XSTRCMP("1.2.840.10045.3.1.7", oidstr) == 0) {
/* nistp256 - secp256r1 - OID 1.2.840.10045.3.1.7 */
size = snprintf(buffer, *buflen, "ecdsa-sha2-nistp256");
}
else if (XSTRCMP("1.3.132.0.34", oidstr) == 0) {
/* nistp384 - secp384r1 - OID 1.3.132.0.34 */
size = snprintf(buffer, *buflen, "ecdsa-sha2-nistp384");
}
else if (XSTRCMP("1.3.132.0.35", oidstr) == 0) {
/* nistp521 - secp521r1 - OID 1.3.132.0.35 */
size = snprintf(buffer, *buflen, "ecdsa-sha2-nistp521");
} else {
/* Otherwise we use the OID... */
size = snprintf(buffer, *buflen, "ecdsa-sha2-%s", oidstr);
}
/* snprintf returns size that would have been written, but limits to buflen-1 chars plus terminator */
if (size >= *buflen) {
err = CRYPT_BUFFER_OVERFLOW;
} else {
err = CRYPT_OK;
}
*buflen = size + 1; /* the string length + NUL byte */
error:
return err;
}
/* ref: $Format:%D$ */
/* git commit: $Format:%H$ */
/* commit time: $Format:%ai$ */