Crypt-Age
view release on metacpan or search on metacpan
lib/Crypt/Age/Keys.pm view on Meta::CPAN
Encodes a 32-byte X25519 public key as a Bech32 string with HRP C<age>.
Returns a lowercase string starting with C<age1>.
=head2 decode_public_key
my $public_bytes = Crypt::Age::Keys->decode_public_key('age1...');
Decodes a Bech32-encoded age public key to raw bytes.
Dies if the HRP is not C<age> or if the decoded data is not 32 bytes.
=head2 encode_secret_key
my $encoded = Crypt::Age::Keys->encode_secret_key($secret_bytes);
Encodes a 32-byte X25519 secret key as a Bech32 string with HRP C<age-secret-key->.
Returns an uppercase string starting with C<AGE-SECRET-KEY-1>.
=head2 decode_secret_key
my $secret_bytes = Crypt::Age::Keys->decode_secret_key('AGE-SECRET-KEY-1...');
Decodes a Bech32-encoded age secret key to raw bytes.
Dies if the HRP is not C<age-secret-key-> or if the decoded data is not 32 bytes.
=head2 public_key_from_secret
my $public_key = Crypt::Age::Keys->public_key_from_secret($secret_key);
Derives the public key from a secret key.
Takes a Bech32-encoded secret key and returns the corresponding Bech32-encoded
public key. This is useful for when you have a secret key and need to know
what public key it corresponds to.
t/01-keys.t view on Meta::CPAN
# Keys should be deterministic length
is(length($public), 62, 'public key has correct length');
is(length($secret), 74, 'secret key has correct length');
}
# Test public key encoding/decoding roundtrip
{
my $raw_key = "\x00" x 32; # 32 zero bytes
my $encoded = Crypt::Age::Keys->encode_public_key($raw_key);
my $decoded = Crypt::Age::Keys->decode_public_key($encoded);
is($decoded, $raw_key, 'public key roundtrip');
}
# Test secret key encoding/decoding roundtrip
{
my $raw_key = "\xff" x 32; # 32 0xff bytes
my $encoded = Crypt::Age::Keys->encode_secret_key($raw_key);
my $decoded = Crypt::Age::Keys->decode_secret_key($encoded);
is($decoded, $raw_key, 'secret key roundtrip');
}
# Test public_key_from_secret
{
my ($public, $secret) = Crypt::Age::Keys->generate_keypair;
my $derived_public = Crypt::Age::Keys->public_key_from_secret($secret);
is($derived_public, $public, 'public key derived from secret matches');
}
( run in 0.581 second using v1.01-cache-2.11-cpan-2398b32b56e )