aptos-move/framework/aptos-stdlib/doc/ed25519.md
<a id="0x1_ed25519"></a>
0x1::ed25519Contains functions for:
SignedMessageUnvalidatedPublicKeyValidatedPublicKeySignaturenew_unvalidated_public_key_from_bytesnew_validated_public_key_from_bytesnew_signature_from_bytespublic_key_to_unvalidatedpublic_key_into_unvalidatedunvalidated_public_key_to_bytesvalidated_public_key_to_bytessignature_to_bytespublic_key_validatesignature_verify_strictsignature_verify_strict_tnew_signed_messageunvalidated_public_key_to_authentication_keyvalidated_public_key_to_authentication_keypublic_key_bytes_to_authentication_keypublic_key_validate_internalsignature_verify_strict_internal<a id="0x1_ed25519_SignedMessage"></a>
SignedMessageA BCS-serializable message, which one can verify signatures on via <code>signature_verify_strict_t</code>
<pre><code><b>struct</b> <a href="ed25519.md#0x1_ed25519_SignedMessage">SignedMessage</a><MessageType> <b>has</b> drop </code></pre> <details> <summary>Fields</summary> <dl> <dt> <code><a href="type_info.md#0x1_type_info">type_info</a>: <a href="type_info.md#0x1_type_info_TypeInfo">type_info::TypeInfo</a></code> </dt> <dd> </dd> <dt> <code>inner: MessageType</code> </dt> <dd> </dd> </dl> </details><a id="0x1_ed25519_UnvalidatedPublicKey"></a>
UnvalidatedPublicKeyAn unvalidated Ed25519 public key: not necessarily an elliptic curve point, just a sequence of 32 bytes
<pre><code><b>struct</b> <a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">UnvalidatedPublicKey</a> <b>has</b> <b>copy</b>, drop, store </code></pre> <details> <summary>Fields</summary> <dl> <dt> <code>bytes: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8></code> </dt> <dd> </dd> </dl> </details><a id="0x1_ed25519_ValidatedPublicKey"></a>
ValidatedPublicKeyA validated Ed25519 public key: not necessarily a prime-order point, could be mixed-order, but will never be a small-order point.
For now, this struct is not used in any verification functions, but it might be in the future.
<pre><code><b>struct</b> <a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ValidatedPublicKey</a> <b>has</b> <b>copy</b>, drop, store </code></pre> <details> <summary>Fields</summary> <dl> <dt> <code>bytes: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8></code> </dt> <dd> </dd> </dl> </details><a id="0x1_ed25519_Signature"></a>
SignatureA purported Ed25519 signature that can be verified via <code>signature_verify_strict</code> or <code>signature_verify_strict_t</code>.
<pre><code><b>struct</b> <a href="ed25519.md#0x1_ed25519_Signature">Signature</a> <b>has</b> <b>copy</b>, drop, store </code></pre> <details> <summary>Fields</summary> <dl> <dt> <code>bytes: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8></code> </dt> <dd> </dd> </dl> </details><a id="@Constants_0"></a>
<a id="0x1_ed25519_PUBLIC_KEY_NUM_BYTES"></a>
The size of a serialized public key, in bytes.
<pre><code><b>const</b> <a href="ed25519.md#0x1_ed25519_PUBLIC_KEY_NUM_BYTES">PUBLIC_KEY_NUM_BYTES</a>: u64 = 32; </code></pre><a id="0x1_ed25519_E_WRONG_PUBKEY_SIZE"></a>
Wrong number of bytes were given as input when deserializing an Ed25519 public key.
<pre><code><b>const</b> <a href="ed25519.md#0x1_ed25519_E_WRONG_PUBKEY_SIZE">E_WRONG_PUBKEY_SIZE</a>: u64 = 1; </code></pre><a id="0x1_ed25519_E_WRONG_SIGNATURE_SIZE"></a>
Wrong number of bytes were given as input when deserializing an Ed25519 signature.
<pre><code><b>const</b> <a href="ed25519.md#0x1_ed25519_E_WRONG_SIGNATURE_SIZE">E_WRONG_SIGNATURE_SIZE</a>: u64 = 2; </code></pre><a id="0x1_ed25519_SIGNATURE_NUM_BYTES"></a>
The size of a serialized signature, in bytes.
<pre><code><b>const</b> <a href="ed25519.md#0x1_ed25519_SIGNATURE_NUM_BYTES">SIGNATURE_NUM_BYTES</a>: u64 = 64; </code></pre><a id="0x1_ed25519_SIGNATURE_SCHEME_ID"></a>
The identifier of the Ed25519 signature scheme, which is used when deriving Aptos authentication keys by hashing it together with an Ed25519 public key.
<pre><code><b>const</b> <a href="ed25519.md#0x1_ed25519_SIGNATURE_SCHEME_ID">SIGNATURE_SCHEME_ID</a>: u8 = 0; </code></pre><a id="0x1_ed25519_new_unvalidated_public_key_from_bytes"></a>
new_unvalidated_public_key_from_bytesParses the input 32 bytes as an unvalidated Ed25519 public key.
<pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_new_unvalidated_public_key_from_bytes">new_unvalidated_public_key_from_bytes</a>(bytes: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8>): <a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">ed25519::UnvalidatedPublicKey</a> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_new_unvalidated_public_key_from_bytes">new_unvalidated_public_key_from_bytes</a>(bytes: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8>): <a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">UnvalidatedPublicKey</a> { <b>assert</b>!(bytes.length() == <a href="ed25519.md#0x1_ed25519_PUBLIC_KEY_NUM_BYTES">PUBLIC_KEY_NUM_BYTES</a>, std::error::invalid_argument(<a href="ed25519.md#0x1_ed25519_E_WRONG_PUBKEY_SIZE">E_WRONG_PUBKEY_SIZE</a>)); <a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">UnvalidatedPublicKey</a> { bytes } } </code></pre> </details><a id="0x1_ed25519_new_validated_public_key_from_bytes"></a>
new_validated_public_key_from_bytesParses the input 32 bytes as a validated Ed25519 public key.
<pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_new_validated_public_key_from_bytes">new_validated_public_key_from_bytes</a>(bytes: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8>): <a href="../../move-stdlib/doc/option.md#0x1_option_Option">option::Option</a><<a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ed25519::ValidatedPublicKey</a>> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_new_validated_public_key_from_bytes">new_validated_public_key_from_bytes</a>(bytes: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8>): Option<<a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ValidatedPublicKey</a>> { <b>if</b> (<a href="ed25519.md#0x1_ed25519_public_key_validate_internal">public_key_validate_internal</a>(bytes)) { <a href="../../move-stdlib/doc/option.md#0x1_option_some">option::some</a>(<a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ValidatedPublicKey</a> { bytes }) } <b>else</b> { <a href="../../move-stdlib/doc/option.md#0x1_option_none">option::none</a><<a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ValidatedPublicKey</a>>() } } </code></pre> </details><a id="0x1_ed25519_new_signature_from_bytes"></a>
new_signature_from_bytesParses the input 64 bytes as a purported Ed25519 signature.
<pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_new_signature_from_bytes">new_signature_from_bytes</a>(bytes: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8>): <a href="ed25519.md#0x1_ed25519_Signature">ed25519::Signature</a> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_new_signature_from_bytes">new_signature_from_bytes</a>(bytes: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8>): <a href="ed25519.md#0x1_ed25519_Signature">Signature</a> { <b>assert</b>!(bytes.length() == <a href="ed25519.md#0x1_ed25519_SIGNATURE_NUM_BYTES">SIGNATURE_NUM_BYTES</a>, std::error::invalid_argument(<a href="ed25519.md#0x1_ed25519_E_WRONG_SIGNATURE_SIZE">E_WRONG_SIGNATURE_SIZE</a>)); <a href="ed25519.md#0x1_ed25519_Signature">Signature</a> { bytes } } </code></pre> </details><a id="0x1_ed25519_public_key_to_unvalidated"></a>
public_key_to_unvalidatedConverts a ValidatedPublicKey to an UnvalidatedPublicKey, which can be used in the strict verification APIs.
<pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_public_key_to_unvalidated">public_key_to_unvalidated</a>(pk: &<a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ed25519::ValidatedPublicKey</a>): <a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">ed25519::UnvalidatedPublicKey</a> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_public_key_to_unvalidated">public_key_to_unvalidated</a>(pk: &<a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ValidatedPublicKey</a>): <a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">UnvalidatedPublicKey</a> { <a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">UnvalidatedPublicKey</a> { bytes: pk.bytes } } </code></pre> </details><a id="0x1_ed25519_public_key_into_unvalidated"></a>
public_key_into_unvalidatedMoves a ValidatedPublicKey into an UnvalidatedPublicKey, which can be used in the strict verification APIs.
<pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_public_key_into_unvalidated">public_key_into_unvalidated</a>(pk: <a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ed25519::ValidatedPublicKey</a>): <a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">ed25519::UnvalidatedPublicKey</a> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_public_key_into_unvalidated">public_key_into_unvalidated</a>(pk: <a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ValidatedPublicKey</a>): <a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">UnvalidatedPublicKey</a> { <a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">UnvalidatedPublicKey</a> { bytes: pk.bytes } } </code></pre> </details><a id="0x1_ed25519_unvalidated_public_key_to_bytes"></a>
unvalidated_public_key_to_bytesSerializes an UnvalidatedPublicKey struct to 32-bytes.
<pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_unvalidated_public_key_to_bytes">unvalidated_public_key_to_bytes</a>(pk: &<a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">ed25519::UnvalidatedPublicKey</a>): <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_unvalidated_public_key_to_bytes">unvalidated_public_key_to_bytes</a>(pk: &<a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">UnvalidatedPublicKey</a>): <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8> { pk.bytes } </code></pre> </details><a id="0x1_ed25519_validated_public_key_to_bytes"></a>
validated_public_key_to_bytesSerializes an ValidatedPublicKey struct to 32-bytes.
<pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_validated_public_key_to_bytes">validated_public_key_to_bytes</a>(pk: &<a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ed25519::ValidatedPublicKey</a>): <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_validated_public_key_to_bytes">validated_public_key_to_bytes</a>(pk: &<a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ValidatedPublicKey</a>): <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8> { pk.bytes } </code></pre> </details><a id="0x1_ed25519_signature_to_bytes"></a>
signature_to_bytesSerializes a Signature struct to 64-bytes.
<pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_signature_to_bytes">signature_to_bytes</a>(sig: &<a href="ed25519.md#0x1_ed25519_Signature">ed25519::Signature</a>): <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_signature_to_bytes">signature_to_bytes</a>(sig: &<a href="ed25519.md#0x1_ed25519_Signature">Signature</a>): <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8> { sig.bytes } </code></pre> </details><a id="0x1_ed25519_public_key_validate"></a>
public_key_validateTakes in an unvalidated public key and attempts to validate it. Returns <code>Some(<a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ValidatedPublicKey</a>)</code> if successful and <code>None</code> otherwise.
<pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_public_key_validate">public_key_validate</a>(pk: &<a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">ed25519::UnvalidatedPublicKey</a>): <a href="../../move-stdlib/doc/option.md#0x1_option_Option">option::Option</a><<a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ed25519::ValidatedPublicKey</a>> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_public_key_validate">public_key_validate</a>(pk: &<a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">UnvalidatedPublicKey</a>): Option<<a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ValidatedPublicKey</a>> { <a href="ed25519.md#0x1_ed25519_new_validated_public_key_from_bytes">new_validated_public_key_from_bytes</a>(pk.bytes) } </code></pre> </details><a id="0x1_ed25519_signature_verify_strict"></a>
signature_verify_strictVerifies a purported Ed25519 <code>signature</code> under an unvalidated <code>public_key</code> on the specified <code>message</code>. This call will validate the public key by checking it is NOT in the small subgroup.
<pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_signature_verify_strict">signature_verify_strict</a>(signature: &<a href="ed25519.md#0x1_ed25519_Signature">ed25519::Signature</a>, public_key: &<a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">ed25519::UnvalidatedPublicKey</a>, message: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8>): bool </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_signature_verify_strict">signature_verify_strict</a>( signature: &<a href="ed25519.md#0x1_ed25519_Signature">Signature</a>, public_key: &<a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">UnvalidatedPublicKey</a>, message: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8> ): bool { <a href="ed25519.md#0x1_ed25519_signature_verify_strict_internal">signature_verify_strict_internal</a>(signature.bytes, public_key.bytes, message) } </code></pre> </details><a id="0x1_ed25519_signature_verify_strict_t"></a>
signature_verify_strict_tThis function is used to verify a signature on any BCS-serializable type T. For now, it is used to verify the proof of private key ownership when rotating authentication keys.
<pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_signature_verify_strict_t">signature_verify_strict_t</a><T: drop>(signature: &<a href="ed25519.md#0x1_ed25519_Signature">ed25519::Signature</a>, public_key: &<a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">ed25519::UnvalidatedPublicKey</a>, data: T): bool </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_signature_verify_strict_t">signature_verify_strict_t</a><T: drop>(signature: &<a href="ed25519.md#0x1_ed25519_Signature">Signature</a>, public_key: &<a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">UnvalidatedPublicKey</a>, data: T): bool { <b>let</b> encoded = <a href="ed25519.md#0x1_ed25519_SignedMessage">SignedMessage</a> { <a href="type_info.md#0x1_type_info">type_info</a>: <a href="type_info.md#0x1_type_info_type_of">type_info::type_of</a><T>(), inner: data, }; <a href="ed25519.md#0x1_ed25519_signature_verify_strict_internal">signature_verify_strict_internal</a>(signature.bytes, public_key.bytes, <a href="../../move-stdlib/doc/bcs.md#0x1_bcs_to_bytes">bcs::to_bytes</a>(&encoded)) } </code></pre> </details><a id="0x1_ed25519_new_signed_message"></a>
new_signed_messageHelper method to construct a SignedMessage struct.
<pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_new_signed_message">new_signed_message</a><T: drop>(data: T): <a href="ed25519.md#0x1_ed25519_SignedMessage">ed25519::SignedMessage</a><T> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_new_signed_message">new_signed_message</a><T: drop>(data: T): <a href="ed25519.md#0x1_ed25519_SignedMessage">SignedMessage</a><T> { <a href="ed25519.md#0x1_ed25519_SignedMessage">SignedMessage</a> { <a href="type_info.md#0x1_type_info">type_info</a>: <a href="type_info.md#0x1_type_info_type_of">type_info::type_of</a><T>(), inner: data, } } </code></pre> </details><a id="0x1_ed25519_unvalidated_public_key_to_authentication_key"></a>
unvalidated_public_key_to_authentication_keyDerives the Aptos-specific authentication key of the given Ed25519 public key.
<pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_unvalidated_public_key_to_authentication_key">unvalidated_public_key_to_authentication_key</a>(pk: &<a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">ed25519::UnvalidatedPublicKey</a>): <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_unvalidated_public_key_to_authentication_key">unvalidated_public_key_to_authentication_key</a>(pk: &<a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">UnvalidatedPublicKey</a>): <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8> { <a href="ed25519.md#0x1_ed25519_public_key_bytes_to_authentication_key">public_key_bytes_to_authentication_key</a>(pk.bytes) } </code></pre> </details><a id="0x1_ed25519_validated_public_key_to_authentication_key"></a>
validated_public_key_to_authentication_keyDerives the Aptos-specific authentication key of the given Ed25519 public key.
<pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_validated_public_key_to_authentication_key">validated_public_key_to_authentication_key</a>(pk: &<a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ed25519::ValidatedPublicKey</a>): <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_validated_public_key_to_authentication_key">validated_public_key_to_authentication_key</a>(pk: &<a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ValidatedPublicKey</a>): <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8> { <a href="ed25519.md#0x1_ed25519_public_key_bytes_to_authentication_key">public_key_bytes_to_authentication_key</a>(pk.bytes) } </code></pre> </details><a id="0x1_ed25519_public_key_bytes_to_authentication_key"></a>
public_key_bytes_to_authentication_keyDerives the Aptos-specific authentication key of the given Ed25519 public key.
<pre><code><b>fun</b> <a href="ed25519.md#0x1_ed25519_public_key_bytes_to_authentication_key">public_key_bytes_to_authentication_key</a>(pk_bytes: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8>): <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>fun</b> <a href="ed25519.md#0x1_ed25519_public_key_bytes_to_authentication_key">public_key_bytes_to_authentication_key</a>(pk_bytes: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8>): <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8> { pk_bytes.push_back(<a href="ed25519.md#0x1_ed25519_SIGNATURE_SCHEME_ID">SIGNATURE_SCHEME_ID</a>); std::hash::sha3_256(pk_bytes) } </code></pre> </details><a id="0x1_ed25519_public_key_validate_internal"></a>
public_key_validate_internalReturn <code><b>true</b></code> if the bytes in <code>public_key</code> can be parsed as a valid Ed25519 public key: i.e., it passes points-on-curve and not-in-small-subgroup checks. Returns <code><b>false</b></code> otherwise.
<pre><code><b>fun</b> <a href="ed25519.md#0x1_ed25519_public_key_validate_internal">public_key_validate_internal</a>(bytes: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8>): bool </code></pre> <details> <summary>Implementation</summary> <pre><code><b>native</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_public_key_validate_internal">public_key_validate_internal</a>(bytes: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8>): bool; </code></pre> </details><a id="0x1_ed25519_signature_verify_strict_internal"></a>
signature_verify_strict_internalReturn true if the Ed25519 <code>signature</code> on <code>message</code> verifies against the Ed25519 <code>public_key</code>. Returns <code><b>false</b></code> if either:
<a id="@Specification_1"></a>
<a id="@Specification_1_new_unvalidated_public_key_from_bytes"></a>
new_unvalidated_public_key_from_bytes<a id="0x1_ed25519_NewUnvalidatedPublicKeyFromBytesAbortsIf"></a>
<pre><code><b>schema</b> <a href="ed25519.md#0x1_ed25519_NewUnvalidatedPublicKeyFromBytesAbortsIf">NewUnvalidatedPublicKeyFromBytesAbortsIf</a> { bytes: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8>; <b>aborts_if</b> len(bytes) != <a href="ed25519.md#0x1_ed25519_PUBLIC_KEY_NUM_BYTES">PUBLIC_KEY_NUM_BYTES</a>; } </code></pre><a id="@Specification_1_new_validated_public_key_from_bytes"></a>
new_validated_public_key_from_bytes<a id="@Specification_1_new_signature_from_bytes"></a>
new_signature_from_bytes<a id="0x1_ed25519_NewSignatureFromBytesAbortsIf"></a>
<pre><code><b>schema</b> <a href="ed25519.md#0x1_ed25519_NewSignatureFromBytesAbortsIf">NewSignatureFromBytesAbortsIf</a> { bytes: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8>; <b>aborts_if</b> len(bytes) != <a href="ed25519.md#0x1_ed25519_SIGNATURE_NUM_BYTES">SIGNATURE_NUM_BYTES</a>; } </code></pre><a id="@Specification_1_public_key_bytes_to_authentication_key"></a>
public_key_bytes_to_authentication_key<a id="@Specification_1_public_key_validate_internal"></a>
public_key_validate_internal<a id="@Specification_1_signature_verify_strict_internal"></a>
signature_verify_strict_internal<a id="@Helper_functions_2"></a>
<a id="0x1_ed25519_spec_signature_verify_strict_internal"></a>
<pre><code><b>fun</b> <a href="ed25519.md#0x1_ed25519_spec_signature_verify_strict_internal">spec_signature_verify_strict_internal</a>( signature: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8>, public_key: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8>, message: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8> ): bool; </code></pre><a id="0x1_ed25519_spec_public_key_validate_internal"></a>
<pre><code><b>fun</b> <a href="ed25519.md#0x1_ed25519_spec_public_key_validate_internal">spec_public_key_validate_internal</a>(bytes: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8>): bool; </code></pre><a id="0x1_ed25519_spec_public_key_bytes_to_authentication_key"></a>
<pre><code><b>fun</b> <a href="ed25519.md#0x1_ed25519_spec_public_key_bytes_to_authentication_key">spec_public_key_bytes_to_authentication_key</a>(pk_bytes: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8>): <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a><u8>; </code></pre><a id="0x1_ed25519_spec_signature_verify_strict_t"></a>
<pre><code><b>fun</b> <a href="ed25519.md#0x1_ed25519_spec_signature_verify_strict_t">spec_signature_verify_strict_t</a><T>(signature: <a href="ed25519.md#0x1_ed25519_Signature">Signature</a>, public_key: <a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">UnvalidatedPublicKey</a>, data: T): bool { <b>let</b> encoded = <a href="ed25519.md#0x1_ed25519_SignedMessage">SignedMessage</a><T> { <a href="type_info.md#0x1_type_info">type_info</a>: <a href="type_info.md#0x1_type_info_type_of">type_info::type_of</a><T>(), inner: data, }; <b>let</b> message = <a href="../../move-stdlib/doc/bcs.md#0x1_bcs_serialize">bcs::serialize</a>(encoded); <a href="ed25519.md#0x1_ed25519_spec_signature_verify_strict_internal">spec_signature_verify_strict_internal</a>(signature.bytes, public_key.bytes, message) } </code></pre>