Back to Aptos Core

Module `0x1::ed25519`

aptos-move/framework/aptos-stdlib/doc/ed25519.md

latest32.3 KB
Original Source

<a id="0x1_ed25519"></a>

Module 0x1::ed25519

Contains functions for:

  1. Ed25519 digital signatures: i.e., EdDSA signatures over Edwards25519 curves with co-factor 8
<pre><code><b>use</b> <a href="../../move-stdlib/doc/bcs.md#0x1_bcs">0x1::bcs</a>; <b>use</b> <a href="../../move-stdlib/doc/hash.md#0x1_hash">0x1::hash</a>; <b>use</b> <a href="../../move-stdlib/doc/option.md#0x1_option">0x1::option</a>; <b>use</b> <a href="type_info.md#0x1_type_info">0x1::type_info</a>; </code></pre>

<a id="0x1_ed25519_SignedMessage"></a>

Struct SignedMessage

A 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>&lt;MessageType&gt; <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>

Struct UnvalidatedPublicKey

An 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>&lt;u8&gt;</code> </dt> <dd> </dd> </dl> </details>

<a id="0x1_ed25519_ValidatedPublicKey"></a>

Struct ValidatedPublicKey

A 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>&lt;u8&gt;</code> </dt> <dd> </dd> </dl> </details>

<a id="0x1_ed25519_Signature"></a>

Struct Signature

A 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>&lt;u8&gt;</code> </dt> <dd> </dd> </dl> </details>

<a id="@Constants_0"></a>

Constants

<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>

Function new_unvalidated_public_key_from_bytes

Parses 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>&lt;u8&gt;): <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>&lt;u8&gt;): <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>

Function new_validated_public_key_from_bytes

Parses 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>&lt;u8&gt;): <a href="../../move-stdlib/doc/option.md#0x1_option_Option">option::Option</a>&lt;<a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ed25519::ValidatedPublicKey</a>&gt; </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>&lt;u8&gt;): Option&lt;<a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ValidatedPublicKey</a>&gt; { <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>&lt;<a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ValidatedPublicKey</a>&gt;() } } </code></pre> </details>

<a id="0x1_ed25519_new_signature_from_bytes"></a>

Function new_signature_from_bytes

Parses 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>&lt;u8&gt;): <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>&lt;u8&gt;): <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>

Function public_key_to_unvalidated

Converts 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>

Function public_key_into_unvalidated

Moves 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>

Function unvalidated_public_key_to_bytes

Serializes 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>&lt;u8&gt; </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>&lt;u8&gt; { pk.bytes } </code></pre> </details>

<a id="0x1_ed25519_validated_public_key_to_bytes"></a>

Function validated_public_key_to_bytes

Serializes 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>&lt;u8&gt; </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>&lt;u8&gt; { pk.bytes } </code></pre> </details>

<a id="0x1_ed25519_signature_to_bytes"></a>

Function signature_to_bytes

Serializes 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>&lt;u8&gt; </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>&lt;u8&gt; { sig.bytes } </code></pre> </details>

<a id="0x1_ed25519_public_key_validate"></a>

Function public_key_validate

Takes 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>&lt;<a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ed25519::ValidatedPublicKey</a>&gt; </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&lt;<a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ValidatedPublicKey</a>&gt; { <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>

Function signature_verify_strict

Verifies 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>&lt;u8&gt;): 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>&lt;u8&gt; ): 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>

Function signature_verify_strict_t

This 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>&lt;T: drop&gt;(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>&lt;T: drop&gt;(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>&lt;T&gt;(), 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>

Function new_signed_message

Helper 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>&lt;T: drop&gt;(data: T): <a href="ed25519.md#0x1_ed25519_SignedMessage">ed25519::SignedMessage</a>&lt;T&gt; </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>&lt;T: drop&gt;(data: T): <a href="ed25519.md#0x1_ed25519_SignedMessage">SignedMessage</a>&lt;T&gt; { <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>&lt;T&gt;(), inner: data, } } </code></pre> </details>

<a id="0x1_ed25519_unvalidated_public_key_to_authentication_key"></a>

Function unvalidated_public_key_to_authentication_key

Derives 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>&lt;u8&gt; </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>&lt;u8&gt; { <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>

Function validated_public_key_to_authentication_key

Derives 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>&lt;u8&gt; </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>&lt;u8&gt; { <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>

Function public_key_bytes_to_authentication_key

Derives 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>&lt;u8&gt;): <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a>&lt;u8&gt; </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>&lt;u8&gt;): <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a>&lt;u8&gt; { 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>

Function public_key_validate_internal

Return <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>&lt;u8&gt;): 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>&lt;u8&gt;): bool; </code></pre> </details>

<a id="0x1_ed25519_signature_verify_strict_internal"></a>

Function signature_verify_strict_internal

Return 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:

  • <code>signature</code> or <code><b>public</b> key</code> are of wrong sizes
  • <code>public_key</code> does not pass points-on-curve or not-in-small-subgroup checks,
  • <code>signature</code> does not pass points-on-curve or not-in-small-subgroup checks,
  • the signature on <code>message</code> does not verify.
<pre><code><b>fun</b> <a href="ed25519.md#0x1_ed25519_signature_verify_strict_internal">signature_verify_strict_internal</a>(signature: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a>&lt;u8&gt;, public_key: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a>&lt;u8&gt;, message: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a>&lt;u8&gt;): bool </code></pre> <details> <summary>Implementation</summary> <pre><code><b>native</b> <b>fun</b> <a href="ed25519.md#0x1_ed25519_signature_verify_strict_internal">signature_verify_strict_internal</a>( signature: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a>&lt;u8&gt;, public_key: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a>&lt;u8&gt;, message: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a>&lt;u8&gt; ): bool; </code></pre> </details>

<a id="@Specification_1"></a>

Specification

<a id="@Specification_1_new_unvalidated_public_key_from_bytes"></a>

Function new_unvalidated_public_key_from_bytes

<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>&lt;u8&gt;): <a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">ed25519::UnvalidatedPublicKey</a> </code></pre> <pre><code><b>include</b> <a href="ed25519.md#0x1_ed25519_NewUnvalidatedPublicKeyFromBytesAbortsIf">NewUnvalidatedPublicKeyFromBytesAbortsIf</a>; <b>ensures</b> result == <a href="ed25519.md#0x1_ed25519_UnvalidatedPublicKey">UnvalidatedPublicKey</a> { bytes }; </code></pre>

<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>&lt;u8&gt;; <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>

Function new_validated_public_key_from_bytes

<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>&lt;u8&gt;): <a href="../../move-stdlib/doc/option.md#0x1_option_Option">option::Option</a>&lt;<a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ed25519::ValidatedPublicKey</a>&gt; </code></pre> <pre><code><b>aborts_if</b> <b>false</b>; <b>let</b> cond = <a href="ed25519.md#0x1_ed25519_spec_public_key_validate_internal">spec_public_key_validate_internal</a>(bytes); <b>ensures</b> cond ==&gt; result == <a href="../../move-stdlib/doc/option.md#0x1_option_spec_some">option::spec_some</a>(<a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ValidatedPublicKey</a>{bytes}); <b>ensures</b> !cond ==&gt; result == <a href="../../move-stdlib/doc/option.md#0x1_option_spec_none">option::spec_none</a>&lt;<a href="ed25519.md#0x1_ed25519_ValidatedPublicKey">ValidatedPublicKey</a>&gt;(); </code></pre>

<a id="@Specification_1_new_signature_from_bytes"></a>

Function new_signature_from_bytes

<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>&lt;u8&gt;): <a href="ed25519.md#0x1_ed25519_Signature">ed25519::Signature</a> </code></pre> <pre><code><b>include</b> <a href="ed25519.md#0x1_ed25519_NewSignatureFromBytesAbortsIf">NewSignatureFromBytesAbortsIf</a>; <b>ensures</b> result == <a href="ed25519.md#0x1_ed25519_Signature">Signature</a> { bytes }; </code></pre>

<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>&lt;u8&gt;; <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>

Function public_key_bytes_to_authentication_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>&lt;u8&gt;): <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a>&lt;u8&gt; </code></pre> <pre><code><b>pragma</b> opaque; <b>aborts_if</b> <b>false</b>; <b>ensures</b> [abstract] result == <a href="ed25519.md#0x1_ed25519_spec_public_key_bytes_to_authentication_key">spec_public_key_bytes_to_authentication_key</a>(pk_bytes); </code></pre>

<a id="@Specification_1_public_key_validate_internal"></a>

Function public_key_validate_internal

<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>&lt;u8&gt;): bool </code></pre> <pre><code><b>pragma</b> opaque; <b>aborts_if</b> <b>false</b>; <b>ensures</b> result == <a href="ed25519.md#0x1_ed25519_spec_public_key_validate_internal">spec_public_key_validate_internal</a>(bytes); </code></pre>

<a id="@Specification_1_signature_verify_strict_internal"></a>

Function signature_verify_strict_internal

<pre><code><b>fun</b> <a href="ed25519.md#0x1_ed25519_signature_verify_strict_internal">signature_verify_strict_internal</a>(signature: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a>&lt;u8&gt;, public_key: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a>&lt;u8&gt;, message: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a>&lt;u8&gt;): bool </code></pre> <pre><code><b>pragma</b> opaque; <b>aborts_if</b> <b>false</b>; <b>ensures</b> result == <a href="ed25519.md#0x1_ed25519_spec_signature_verify_strict_internal">spec_signature_verify_strict_internal</a>(signature, public_key, message); </code></pre>

<a id="@Helper_functions_2"></a>

Helper functions

<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>&lt;u8&gt;, public_key: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a>&lt;u8&gt;, message: <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a>&lt;u8&gt; ): 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>&lt;u8&gt;): 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>&lt;u8&gt;): <a href="../../move-stdlib/doc/vector.md#0x1_vector">vector</a>&lt;u8&gt;; </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>&lt;T&gt;(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>&lt;T&gt; { <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>&lt;T&gt;(), 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>