EV-Nats
view release on metacpan or search on metacpan
src/EV__Nats.xs view on Meta::CPAN
return -1;
if (raw_len < 36) return -1; /* prefix(2) + seed(32) + CRC(2) */
/* Validate CRC16 */
uint16_t expected_crc = (uint16_t)raw[raw_len - 2] | ((uint16_t)raw[raw_len - 1] << 8);
uint16_t actual_crc = nats_crc16(raw, raw_len - 2);
if (expected_crc != actual_crc) return -1;
unsigned char *seed = raw + 2;
EVP_PKEY *pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_ED25519, NULL, seed, 32);
if (!pkey) return -1;
EVP_MD_CTX *ctx = EVP_MD_CTX_new();
if (!ctx) { EVP_PKEY_free(pkey); return -1; }
unsigned char sig[64];
size_t sig_len = sizeof(sig);
int ok = (EVP_DigestSignInit(ctx, NULL, NULL, NULL, pkey) == 1 &&
EVP_DigestSign(ctx, sig, &sig_len, (const unsigned char *)nonce, nonce_len) == 1);
src/EV__Nats.xs view on Meta::CPAN
if (nats_base32_decode(seed_encoded, strlen(seed_encoded), raw, &raw_len) != 0)
return -1;
if (raw_len < 36) return -1;
uint16_t expected_crc = (uint16_t)raw[raw_len - 2] | ((uint16_t)raw[raw_len - 1] << 8);
if (nats_crc16(raw, raw_len - 2) != expected_crc) return -1;
unsigned char *seed = raw + 2;
EVP_PKEY *pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_ED25519, NULL, seed, 32);
if (!pkey) return -1;
unsigned char pub[32];
size_t pub_len = 32;
int ok = EVP_PKEY_get_raw_public_key(pkey, pub, &pub_len) == 1;
EVP_PKEY_free(pkey);
if (!ok) return -1;
/* Derive public key prefix from seed prefix.
Seed prefix byte encodes type in bits 3-7: User=0xD0>>3, etc.
( run in 2.403 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )