Compare commits
10
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1b67086028 | ||
|
|
68cc7d3709 | ||
|
|
59e3fedb21 | ||
|
|
8da56845b8 | ||
|
|
c0162ec8d9 | ||
|
|
ee91c9776c | ||
|
|
0fdfdfdaee | ||
|
|
eafa134c94 | ||
|
|
209b957ae4 | ||
|
|
f79ebf9844 |
+5
-4
@@ -1,6 +1,7 @@
|
|||||||
// Copyright (c) Facebook, Inc. and its affiliates.
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
//
|
//
|
||||||
// This source code is licensed under both the MIT license found in the
|
// This source code is dual-licensed under either the MIT license found in the
|
||||||
// LICENSE-MIT file in the root directory of this source tree and the Apache
|
// LICENSE-MIT file in the root directory of this source tree or the Apache
|
||||||
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
||||||
// of this source tree.
|
// of this source tree. You may select, at your option, one of the above-listed
|
||||||
|
// licenses.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
pull_request:
|
pull_request:
|
||||||
types: [opened, repoened, synchronize]
|
types: [opened, reopened, synchronize]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
cargo-audit:
|
cargo-audit:
|
||||||
@@ -24,7 +24,7 @@ jobs:
|
|||||||
run: cargo install cargo-audit
|
run: cargo install cargo-audit
|
||||||
|
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Run cargo audit
|
- name: Run cargo audit
|
||||||
run: cargo audit -D warnings
|
run: cargo audit -D warnings
|
||||||
@@ -47,7 +47,7 @@ jobs:
|
|||||||
name: test
|
name: test
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Install ${{ matrix.toolchain }} toolchain
|
- name: Install ${{ matrix.toolchain }} toolchain
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
@@ -99,8 +99,8 @@ jobs:
|
|||||||
- --features danger
|
- --features danger
|
||||||
- --features serde
|
- --features serde
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: hecrj/setup-rust-action@v1
|
- uses: hecrj/setup-rust-action@v2
|
||||||
- run: rustup target add ${{ matrix.target }}
|
- run: rustup target add ${{ matrix.target }}
|
||||||
- run: cargo build --verbose --target=${{ matrix.target }} --no-default-features ${{ matrix.frontend_feature }} ${{ matrix.backend_feature }}
|
- run: cargo build --verbose --target=${{ matrix.target }} --no-default-features ${{ matrix.frontend_feature }} ${{ matrix.backend_feature }}
|
||||||
|
|
||||||
@@ -110,7 +110,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Install stable toolchain
|
- name: Install stable toolchain
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
@@ -140,7 +140,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Install nightly toolchain
|
- name: Install nightly toolchain
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
@@ -170,10 +170,10 @@ jobs:
|
|||||||
key: taplo
|
key: taplo
|
||||||
|
|
||||||
- name: Install Taplo
|
- name: Install Taplo
|
||||||
run: cargo install taplo-cli
|
run: cargo install taplo-cli --locked
|
||||||
|
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Run Taplo
|
- name: Run Taplo
|
||||||
run: taplo fmt --check
|
run: taplo fmt --check
|
||||||
|
|||||||
@@ -10,9 +10,10 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-latest]
|
os: [ubuntu-latest]
|
||||||
|
rust: [stable]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: hecrj/setup-rust-action@v1
|
- uses: hecrj/setup-rust-action@v2
|
||||||
with:
|
with:
|
||||||
rust-version: ${{ matrix.rust }}
|
rust-version: ${{ matrix.rust }}
|
||||||
- uses: actions/checkout@master
|
- uses: actions/checkout@master
|
||||||
|
|||||||
@@ -1,5 +1,14 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 0.5.0-pre.7 (January 11, 2023)
|
||||||
|
* Updated to be in sync with RFC 9497
|
||||||
|
|
||||||
|
## 0.5.0-pre.6 (July 24, 2023)
|
||||||
|
* Updated curve25519-dalek dependency to 4
|
||||||
|
|
||||||
|
## 0.5.0-pre.5 (June 27, 2023)
|
||||||
|
* Updated curve25519-dalek dependency to 4.0.0-rc.3
|
||||||
|
|
||||||
## 0.5.0-pre.4 (May 20, 2023)
|
## 0.5.0-pre.4 (May 20, 2023)
|
||||||
* Updated curve25519-dalek dependency to 4.0.0-rc.2
|
* Updated curve25519-dalek dependency to 4.0.0-rc.2
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -27,4 +27,5 @@ outlined on that page and do not file a public issue.
|
|||||||
|
|
||||||
## License
|
## License
|
||||||
By contributing to voprf, you agree that your contributions will be
|
By contributing to voprf, you agree that your contributions will be
|
||||||
licensed under the LICENSE file in the root directory of this source tree.
|
licensed under both the LICENSE-MIT and LICENSE-APACHE files in the root
|
||||||
|
directory of this source tree.
|
||||||
|
|||||||
+6
-2
@@ -9,7 +9,7 @@ name = "voprf"
|
|||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
repository = "https://github.com/facebook/voprf/"
|
repository = "https://github.com/facebook/voprf/"
|
||||||
rust-version = "1.65"
|
rust-version = "1.65"
|
||||||
version = "0.5.0-pre.4"
|
version = "0.5.0-pre.7"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
alloc = []
|
alloc = []
|
||||||
@@ -21,7 +21,7 @@ serde = ["generic-array/serde", "dep:serde"]
|
|||||||
std = ["alloc"]
|
std = ["alloc"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
curve25519-dalek = { version = "=4.0.0-rc.2", default-features = false, features = [
|
curve25519-dalek = { version = "4", default-features = false, features = [
|
||||||
"rand_core",
|
"rand_core",
|
||||||
"zeroize",
|
"zeroize",
|
||||||
], optional = true }
|
], optional = true }
|
||||||
@@ -53,6 +53,10 @@ p384 = { version = "0.13", default-features = false, features = [
|
|||||||
"hash2curve",
|
"hash2curve",
|
||||||
"voprf",
|
"voprf",
|
||||||
] }
|
] }
|
||||||
|
p521 = { version = "0.13.3", default-features = false, features = [
|
||||||
|
"hash2curve",
|
||||||
|
"voprf",
|
||||||
|
] }
|
||||||
proptest = "1"
|
proptest = "1"
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
regex = "1"
|
regex = "1"
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
## License
|
|
||||||
|
|
||||||
Licensed under either of
|
|
||||||
* Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
|
|
||||||
* MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
|
|
||||||
at your option.
|
|
||||||
|
|
||||||
### Contribution
|
|
||||||
|
|
||||||
Unless you explicitly state otherwise, any contribution intentionally submitted
|
|
||||||
for inclusion in the work by you, as defined in the Apache-2.0 license, shall
|
|
||||||
be dual licensed as above, without any additional terms or conditions.
|
|
||||||
@@ -3,7 +3,7 @@ An implementation of a (verifiable) oblivious pseudorandom function (VOPRF)
|
|||||||
|
|
||||||
A VOPRF is a verifiable oblivious pseudorandom function, a protocol between a client and a server. The regular (non-verifiable) OPRF is also supported in this implementation.
|
A VOPRF is a verifiable oblivious pseudorandom function, a protocol between a client and a server. The regular (non-verifiable) OPRF is also supported in this implementation.
|
||||||
|
|
||||||
This implementation is based on the [Internet Draft for VOPRF](https://github.com/cfrg/draft-irtf-cfrg-voprf).
|
This implementation is based on [RFC 9497](https://www.rfc-editor.org/rfc/rfc9497).
|
||||||
|
|
||||||
Documentation
|
Documentation
|
||||||
-------------
|
-------------
|
||||||
@@ -16,7 +16,7 @@ Installation
|
|||||||
Add the following line to the dependencies of your `Cargo.toml`:
|
Add the following line to the dependencies of your `Cargo.toml`:
|
||||||
|
|
||||||
```
|
```
|
||||||
voprf = "0.5.0-pre.4"
|
voprf = "0.5.0-pre.7"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Minimum Supported Rust Version
|
### Minimum Supported Rust Version
|
||||||
@@ -32,4 +32,6 @@ To learn more about contributing to this project, [see this document](./CONTRIBU
|
|||||||
License
|
License
|
||||||
-------
|
-------
|
||||||
|
|
||||||
This project is [licensed](./LICENSE) under either Apache 2.0 or MIT, at your option.
|
This project is dual-licensed under either the [MIT license](./LICENSE-MIT)
|
||||||
|
or the [Apache License, Version 2.0](./LICENSE-APACHE).
|
||||||
|
You may select, at your option, one of the above-listed licenses.
|
||||||
|
|||||||
+6
-5
@@ -1,9 +1,10 @@
|
|||||||
// Copyright (c) Facebook, Inc. and its affiliates.
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
//
|
//
|
||||||
// This source code is licensed under both the MIT license found in the
|
// This source code is dual-licensed under either the MIT license found in the
|
||||||
// LICENSE-MIT file in the root directory of this source tree and the Apache
|
// LICENSE-MIT file in the root directory of this source tree or the Apache
|
||||||
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
||||||
// of this source tree.
|
// of this source tree. You may select, at your option, one of the above-listed
|
||||||
|
// licenses.
|
||||||
|
|
||||||
//! Defines the CipherSuite trait to specify the underlying primitives for VOPRF
|
//! Defines the CipherSuite trait to specify the underlying primitives for VOPRF
|
||||||
|
|
||||||
@@ -21,7 +22,7 @@ where
|
|||||||
IsLess<U256> + IsLessOrEqual<<Self::Hash as BlockSizeUser>::BlockSize>,
|
IsLess<U256> + IsLessOrEqual<<Self::Hash as BlockSizeUser>::BlockSize>,
|
||||||
{
|
{
|
||||||
/// The ciphersuite identifier as dictated by
|
/// The ciphersuite identifier as dictated by
|
||||||
/// <https://datatracker.ietf.org/doc/draft-irtf-cfrg-voprf/>
|
/// <https://www.rfc-editor.org/rfc/rfc9497>
|
||||||
const ID: &'static str;
|
const ID: &'static str;
|
||||||
|
|
||||||
/// A finite cyclic group along with a point representation that allows some
|
/// A finite cyclic group along with a point representation that allows some
|
||||||
|
|||||||
+9
-8
@@ -1,9 +1,10 @@
|
|||||||
// Copyright (c) Facebook, Inc. and its affiliates.
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
//
|
//
|
||||||
// This source code is licensed under both the MIT license found in the
|
// This source code is dual-licensed under either the MIT license found in the
|
||||||
// LICENSE-MIT file in the root directory of this source tree and the Apache
|
// LICENSE-MIT file in the root directory of this source tree or the Apache
|
||||||
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
||||||
// of this source tree.
|
// of this source tree. You may select, at your option, one of the above-listed
|
||||||
|
// licenses.
|
||||||
|
|
||||||
//! Common functionality between multiple OPRF modes.
|
//! Common functionality between multiple OPRF modes.
|
||||||
|
|
||||||
@@ -154,7 +155,7 @@ where
|
|||||||
<CS::Hash as OutputSizeUser>::OutputSize:
|
<CS::Hash as OutputSizeUser>::OutputSize:
|
||||||
IsLess<U256> + IsLessOrEqual<<CS::Hash as BlockSizeUser>::BlockSize>,
|
IsLess<U256> + IsLessOrEqual<<CS::Hash as BlockSizeUser>::BlockSize>,
|
||||||
{
|
{
|
||||||
// https://www.ietf.org/archive/id/draft-irtf-cfrg-voprf-11.html#section-2.2.1
|
// https://www.rfc-editor.org/rfc/rfc9497#section-2.2.1
|
||||||
|
|
||||||
let (m, z) = compute_composites::<CS, _, _>(Some(k), b, cs, ds, mode)?;
|
let (m, z) = compute_composites::<CS, _, _>(Some(k), b, cs, ds, mode)?;
|
||||||
|
|
||||||
@@ -217,7 +218,7 @@ where
|
|||||||
<CS::Hash as OutputSizeUser>::OutputSize:
|
<CS::Hash as OutputSizeUser>::OutputSize:
|
||||||
IsLess<U256> + IsLessOrEqual<<CS::Hash as BlockSizeUser>::BlockSize>,
|
IsLess<U256> + IsLessOrEqual<<CS::Hash as BlockSizeUser>::BlockSize>,
|
||||||
{
|
{
|
||||||
// https://www.ietf.org/archive/id/draft-irtf-cfrg-voprf-11.html#section-2.2.2
|
// https://www.rfc-editor.org/rfc/rfc9497#section-2.2.2
|
||||||
let (m, z) = compute_composites::<CS, _, _>(None, b, cs, ds, mode)?;
|
let (m, z) = compute_composites::<CS, _, _>(None, b, cs, ds, mode)?;
|
||||||
let t2 = (a * &proof.s_scalar) + &(b * &proof.c_scalar);
|
let t2 = (a * &proof.s_scalar) + &(b * &proof.c_scalar);
|
||||||
let t3 = (m * &proof.s_scalar) + &(z * &proof.c_scalar);
|
let t3 = (m * &proof.s_scalar) + &(z * &proof.c_scalar);
|
||||||
@@ -286,7 +287,7 @@ where
|
|||||||
<CS::Hash as OutputSizeUser>::OutputSize:
|
<CS::Hash as OutputSizeUser>::OutputSize:
|
||||||
IsLess<U256> + IsLessOrEqual<<CS::Hash as BlockSizeUser>::BlockSize>,
|
IsLess<U256> + IsLessOrEqual<<CS::Hash as BlockSizeUser>::BlockSize>,
|
||||||
{
|
{
|
||||||
// https://www.ietf.org/archive/id/draft-irtf-cfrg-voprf-11.html#section-2.2.1
|
// https://www.rfc-editor.org/rfc/rfc9497#section-2.2.1
|
||||||
|
|
||||||
let elem_len = <CS::Group as Group>::ElemLen::U16.to_be_bytes();
|
let elem_len = <CS::Group as Group>::ElemLen::U16.to_be_bytes();
|
||||||
|
|
||||||
@@ -512,7 +513,7 @@ impl<L: ArrayLength<u8>> Dst<L> {
|
|||||||
{
|
{
|
||||||
let par_1 = par_1.into();
|
let par_1 = par_1.into();
|
||||||
// Generates the contextString parameter as defined in
|
// Generates the contextString parameter as defined in
|
||||||
// <https://datatracker.ietf.org/doc/draft-irtf-cfrg-voprf/>
|
// <https://www.rfc-editor.org/rfc/rfc9497#section-3.1>
|
||||||
let par_2 = GenericArray::from(STR_OPRF)
|
let par_2 = GenericArray::from(STR_OPRF)
|
||||||
.concat([mode.to_u8()].into())
|
.concat([mode.to_u8()].into())
|
||||||
.concat([b'-'].into());
|
.concat([b'-'].into());
|
||||||
|
|||||||
+5
-4
@@ -1,9 +1,10 @@
|
|||||||
// Copyright (c) Facebook, Inc. and its affiliates.
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
//
|
//
|
||||||
// This source code is licensed under both the MIT license found in the
|
// This source code is dual-licensed under either the MIT license found in the
|
||||||
// LICENSE-MIT file in the root directory of this source tree and the Apache
|
// LICENSE-MIT file in the root directory of this source tree or the Apache
|
||||||
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
||||||
// of this source tree.
|
// of this source tree. You may select, at your option, one of the above-listed
|
||||||
|
// licenses.
|
||||||
|
|
||||||
//! Errors which are produced during an execution of the protocol
|
//! Errors which are produced during an execution of the protocol
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
// Copyright (c) Facebook, Inc. and its affiliates.
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
//
|
//
|
||||||
// This source code is licensed under both the MIT license found in the
|
// This source code is dual-licensed under either the MIT license found in the
|
||||||
// LICENSE-MIT file in the root directory of this source tree and the Apache
|
// LICENSE-MIT file in the root directory of this source tree or the Apache
|
||||||
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
||||||
// of this source tree.
|
// of this source tree. You may select, at your option, one of the above-listed
|
||||||
|
// licenses.
|
||||||
|
|
||||||
use digest::core_api::BlockSizeUser;
|
use digest::core_api::BlockSizeUser;
|
||||||
use digest::{FixedOutput, HashMarker};
|
use digest::{FixedOutput, HashMarker};
|
||||||
@@ -37,7 +38,7 @@ where
|
|||||||
type ScalarLen = FieldBytesSize<Self>;
|
type ScalarLen = FieldBytesSize<Self>;
|
||||||
|
|
||||||
// Implements the `hash_to_curve()` function from
|
// Implements the `hash_to_curve()` function from
|
||||||
// https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-hash-to-curve-11#section-3
|
// https://www.rfc-editor.org/rfc/rfc9380.html#section-3
|
||||||
fn hash_to_curve<H>(input: &[&[u8]], dst: &[&[u8]]) -> Result<Self::Elem, InternalError>
|
fn hash_to_curve<H>(input: &[&[u8]], dst: &[&[u8]]) -> Result<Self::Elem, InternalError>
|
||||||
where
|
where
|
||||||
H: BlockSizeUser + Default + FixedOutput + HashMarker,
|
H: BlockSizeUser + Default + FixedOutput + HashMarker,
|
||||||
|
|||||||
+6
-5
@@ -1,9 +1,10 @@
|
|||||||
// Copyright (c) Facebook, Inc. and its affiliates.
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
//
|
//
|
||||||
// This source code is licensed under both the MIT license found in the
|
// This source code is dual-licensed under either the MIT license found in the
|
||||||
// LICENSE-MIT file in the root directory of this source tree and the Apache
|
// LICENSE-MIT file in the root directory of this source tree or the Apache
|
||||||
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
||||||
// of this source tree.
|
// of this source tree. You may select, at your option, one of the above-listed
|
||||||
|
// licenses.
|
||||||
|
|
||||||
//! Defines the Group trait to specify the underlying prime order group
|
//! Defines the Group trait to specify the underlying prime order group
|
||||||
|
|
||||||
@@ -26,7 +27,7 @@ use zeroize::Zeroize;
|
|||||||
use crate::{InternalError, Result};
|
use crate::{InternalError, Result};
|
||||||
|
|
||||||
/// A prime-order subgroup of a base field (EC, prime-order field ...). This
|
/// A prime-order subgroup of a base field (EC, prime-order field ...). This
|
||||||
/// subgroup is noted additively — as in the draft RFC — in this trait.
|
/// subgroup is noted additively — as in the RFC — in this trait.
|
||||||
pub trait Group {
|
pub trait Group {
|
||||||
/// The type of group elements
|
/// The type of group elements
|
||||||
type Elem: ConstantTimeEq
|
type Elem: ConstantTimeEq
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
// Copyright (c) Facebook, Inc. and its affiliates.
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
//
|
//
|
||||||
// This source code is licensed under both the MIT license found in the
|
// This source code is dual-licensed under either the MIT license found in the
|
||||||
// LICENSE-MIT file in the root directory of this source tree and the Apache
|
// LICENSE-MIT file in the root directory of this source tree or the Apache
|
||||||
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
||||||
// of this source tree.
|
// of this source tree. You may select, at your option, one of the above-listed
|
||||||
|
// licenses.
|
||||||
|
|
||||||
use curve25519_dalek::constants::RISTRETTO_BASEPOINT_POINT;
|
use curve25519_dalek::constants::RISTRETTO_BASEPOINT_POINT;
|
||||||
use curve25519_dalek::ristretto::{CompressedRistretto, RistrettoPoint};
|
use curve25519_dalek::ristretto::{CompressedRistretto, RistrettoPoint};
|
||||||
@@ -43,7 +44,7 @@ impl Group for Ristretto255 {
|
|||||||
type ScalarLen = U32;
|
type ScalarLen = U32;
|
||||||
|
|
||||||
// Implements the `hash_to_ristretto255()` function from
|
// Implements the `hash_to_ristretto255()` function from
|
||||||
// https://www.ietf.org/archive/id/draft-irtf-cfrg-hash-to-curve-10.txt
|
// https://www.rfc-editor.org/rfc/rfc9380.html#appendix-B
|
||||||
fn hash_to_curve<H>(input: &[&[u8]], dst: &[&[u8]]) -> Result<Self::Elem, InternalError>
|
fn hash_to_curve<H>(input: &[&[u8]], dst: &[&[u8]]) -> Result<Self::Elem, InternalError>
|
||||||
where
|
where
|
||||||
H: BlockSizeUser + Default + FixedOutput + HashMarker,
|
H: BlockSizeUser + Default + FixedOutput + HashMarker,
|
||||||
@@ -58,7 +59,7 @@ impl Group for Ristretto255 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Implements the `HashToScalar()` function from
|
// Implements the `HashToScalar()` function from
|
||||||
// https://www.ietf.org/archive/id/draft-irtf-cfrg-voprf-07.html#section-4.1
|
// https://www.rfc-editor.org/rfc/rfc9497#section-4.1
|
||||||
fn hash_to_scalar<H>(input: &[&[u8]], dst: &[&[u8]]) -> Result<Self::Scalar, InternalError>
|
fn hash_to_scalar<H>(input: &[&[u8]], dst: &[&[u8]]) -> Result<Self::Scalar, InternalError>
|
||||||
where
|
where
|
||||||
H: BlockSizeUser + Default + FixedOutput + HashMarker,
|
H: BlockSizeUser + Default + FixedOutput + HashMarker,
|
||||||
|
|||||||
+9
-4
@@ -1,9 +1,10 @@
|
|||||||
// Copyright (c) Facebook, Inc. and its affiliates.
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
//
|
//
|
||||||
// This source code is licensed under both the MIT license found in the
|
// This source code is dual-licensed under either the MIT license found in the
|
||||||
// LICENSE-MIT file in the root directory of this source tree and the Apache
|
// LICENSE-MIT file in the root directory of this source tree or the Apache
|
||||||
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
||||||
// of this source tree.
|
// of this source tree. You may select, at your option, one of the above-listed
|
||||||
|
// licenses.
|
||||||
|
|
||||||
//! Includes a series of tests for the group implementations
|
//! Includes a series of tests for the group implementations
|
||||||
|
|
||||||
@@ -16,6 +17,7 @@ use crate::{Error, Group, Result};
|
|||||||
fn test_group_properties() -> Result<()> {
|
fn test_group_properties() -> Result<()> {
|
||||||
use p256::NistP256;
|
use p256::NistP256;
|
||||||
use p384::NistP384;
|
use p384::NistP384;
|
||||||
|
use p521::NistP521;
|
||||||
|
|
||||||
#[cfg(feature = "ristretto255")]
|
#[cfg(feature = "ristretto255")]
|
||||||
{
|
{
|
||||||
@@ -31,6 +33,9 @@ fn test_group_properties() -> Result<()> {
|
|||||||
test_identity_element_error::<NistP384>()?;
|
test_identity_element_error::<NistP384>()?;
|
||||||
test_zero_scalar_error::<NistP384>()?;
|
test_zero_scalar_error::<NistP384>()?;
|
||||||
|
|
||||||
|
test_identity_element_error::<NistP521>()?;
|
||||||
|
test_zero_scalar_error::<NistP521>()?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+7
-8
@@ -1,16 +1,15 @@
|
|||||||
// Copyright (c) Facebook, Inc. and its affiliates.
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
//
|
//
|
||||||
// This source code is licensed under both the MIT license found in the
|
// This source code is dual-licensed under either the MIT license found in the
|
||||||
// LICENSE-MIT file in the root directory of this source tree and the Apache
|
// LICENSE-MIT file in the root directory of this source tree or the Apache
|
||||||
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
||||||
// of this source tree.
|
// of this source tree. You may select, at your option, one of the above-listed
|
||||||
|
// licenses.
|
||||||
|
|
||||||
//! An implementation of a verifiable oblivious pseudorandom function (VOPRF)
|
//! An implementation of a verifiable oblivious pseudorandom function (VOPRF)
|
||||||
//!
|
//!
|
||||||
//! Note: This implementation is in sync with
|
//! Note: This implementation is in sync with
|
||||||
//! [draft-irtf-cfrg-voprf-19](https://www.ietf.org/archive/id/draft-irtf-cfrg-voprf-19.html),
|
//! [RFC 9497](https://www.rfc-editor.org/rfc/rfc9497).
|
||||||
//! but this specification is subject to change, until the final version
|
|
||||||
//! published by the IETF.
|
|
||||||
//!
|
//!
|
||||||
//! # Overview
|
//! # Overview
|
||||||
//!
|
//!
|
||||||
@@ -511,7 +510,7 @@
|
|||||||
//! and [PoprfClient] are used, and that each of the functions accept an
|
//! and [PoprfClient] are used, and that each of the functions accept an
|
||||||
//! additional (and optional) info parameter which represents the public input.
|
//! additional (and optional) info parameter which represents the public input.
|
||||||
//! See
|
//! See
|
||||||
//! <https://www.ietf.org/archive/id/draft-irtf-cfrg-voprf-11.html#name-poprf-public-input>
|
//! <https://www.rfc-editor.org/rfc/rfc9497#name-poprf-public-input>
|
||||||
//! for more detailed information on how this public input should be used.
|
//! for more detailed information on how this public input should be used.
|
||||||
//!
|
//!
|
||||||
//! # Features
|
//! # Features
|
||||||
|
|||||||
+13
-4
@@ -1,9 +1,10 @@
|
|||||||
// Copyright (c) Facebook, Inc. and its affiliates.
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
//
|
//
|
||||||
// This source code is licensed under both the MIT license found in the
|
// This source code is dual-licensed under either the MIT license found in the
|
||||||
// LICENSE-MIT file in the root directory of this source tree and the Apache
|
// LICENSE-MIT file in the root directory of this source tree or the Apache
|
||||||
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
||||||
// of this source tree.
|
// of this source tree. You may select, at your option, one of the above-listed
|
||||||
|
// licenses.
|
||||||
|
|
||||||
//! Contains the main OPRF API
|
//! Contains the main OPRF API
|
||||||
|
|
||||||
@@ -426,6 +427,7 @@ mod tests {
|
|||||||
fn test_functionality() -> Result<()> {
|
fn test_functionality() -> Result<()> {
|
||||||
use p256::NistP256;
|
use p256::NistP256;
|
||||||
use p384::NistP384;
|
use p384::NistP384;
|
||||||
|
use p521::NistP521;
|
||||||
|
|
||||||
#[cfg(feature = "ristretto255")]
|
#[cfg(feature = "ristretto255")]
|
||||||
{
|
{
|
||||||
@@ -453,6 +455,13 @@ mod tests {
|
|||||||
zeroize_oprf_client::<NistP384>();
|
zeroize_oprf_client::<NistP384>();
|
||||||
zeroize_oprf_server::<NistP384>();
|
zeroize_oprf_server::<NistP384>();
|
||||||
|
|
||||||
|
base_retrieval::<NistP521>();
|
||||||
|
base_inversion_unsalted::<NistP521>();
|
||||||
|
server_evaluate::<NistP521>();
|
||||||
|
|
||||||
|
zeroize_oprf_client::<NistP521>();
|
||||||
|
zeroize_oprf_server::<NistP521>();
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-5
@@ -1,9 +1,10 @@
|
|||||||
// Copyright (c) Facebook, Inc. and its affiliates.
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
//
|
//
|
||||||
// This source code is licensed under both the MIT license found in the
|
// This source code is dual-licensed under either the MIT license found in the
|
||||||
// LICENSE-MIT file in the root directory of this source tree and the Apache
|
// LICENSE-MIT file in the root directory of this source tree or the Apache
|
||||||
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
||||||
// of this source tree.
|
// of this source tree. You may select, at your option, one of the above-listed
|
||||||
|
// licenses.
|
||||||
|
|
||||||
//! Contains the main POPRF API
|
//! Contains the main POPRF API
|
||||||
|
|
||||||
@@ -719,7 +720,7 @@ where
|
|||||||
)?;
|
)?;
|
||||||
|
|
||||||
Ok(blinds
|
Ok(blinds
|
||||||
.zip(messages.into_iter())
|
.zip(messages)
|
||||||
.map(|(blind, x)| x.0 * &CS::Group::invert_scalar(blind)))
|
.map(|(blind, x)| x.0 * &CS::Group::invert_scalar(blind)))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -966,6 +967,7 @@ mod tests {
|
|||||||
fn test_functionality() -> Result<()> {
|
fn test_functionality() -> Result<()> {
|
||||||
use p256::NistP256;
|
use p256::NistP256;
|
||||||
use p384::NistP384;
|
use p384::NistP384;
|
||||||
|
use p521::NistP521;
|
||||||
|
|
||||||
#[cfg(feature = "ristretto255")]
|
#[cfg(feature = "ristretto255")]
|
||||||
{
|
{
|
||||||
@@ -993,6 +995,13 @@ mod tests {
|
|||||||
zeroize_verifiable_client::<NistP384>();
|
zeroize_verifiable_client::<NistP384>();
|
||||||
zeroize_verifiable_server::<NistP384>();
|
zeroize_verifiable_server::<NistP384>();
|
||||||
|
|
||||||
|
verifiable_retrieval::<NistP521>();
|
||||||
|
verifiable_bad_public_key::<NistP521>();
|
||||||
|
verifiable_server_evaluate::<NistP521>();
|
||||||
|
|
||||||
|
zeroize_verifiable_client::<NistP521>();
|
||||||
|
zeroize_verifiable_server::<NistP521>();
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
// Copyright (c) Facebook, Inc. and its affiliates.
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
//
|
//
|
||||||
// This source code is licensed under both the MIT license found in the
|
// This source code is dual-licensed under either the MIT license found in the
|
||||||
// LICENSE-MIT file in the root directory of this source tree and the Apache
|
// LICENSE-MIT file in the root directory of this source tree or the Apache
|
||||||
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
||||||
// of this source tree.
|
// of this source tree. You may select, at your option, one of the above-listed
|
||||||
|
// licenses.
|
||||||
|
|
||||||
//! Handles the serialization of each of the components used in the VOPRF
|
//! Handles the serialization of each of the components used in the VOPRF
|
||||||
//! protocol
|
//! protocol
|
||||||
@@ -390,6 +391,7 @@ mod test {
|
|||||||
|
|
||||||
let _ = $item::<p256::NistP256>::deserialize(&$bytes[..]);
|
let _ = $item::<p256::NistP256>::deserialize(&$bytes[..]);
|
||||||
let _ = $item::<p384::NistP384>::deserialize(&$bytes[..]);
|
let _ = $item::<p384::NistP384>::deserialize(&$bytes[..]);
|
||||||
|
let _ = $item::<p521::NistP521>::deserialize(&$bytes[..]);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+915
-1024
File diff suppressed because it is too large
Load Diff
@@ -1,9 +1,10 @@
|
|||||||
// Copyright (c) Facebook, Inc. and its affiliates.
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
//
|
//
|
||||||
// This source code is licensed under both the MIT license found in the
|
// This source code is dual-licensed under either the MIT license found in the
|
||||||
// LICENSE-MIT file in the root directory of this source tree and the Apache
|
// LICENSE-MIT file in the root directory of this source tree or the Apache
|
||||||
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
||||||
// of this source tree.
|
// of this source tree. You may select, at your option, one of the above-listed
|
||||||
|
// licenses.
|
||||||
|
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
use core::cmp::min;
|
use core::cmp::min;
|
||||||
|
|||||||
+5
-4
@@ -1,9 +1,10 @@
|
|||||||
// Copyright (c) Facebook, Inc. and its affiliates.
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
//
|
//
|
||||||
// This source code is licensed under both the MIT license found in the
|
// This source code is dual-licensed under either the MIT license found in the
|
||||||
// LICENSE-MIT file in the root directory of this source tree and the Apache
|
// LICENSE-MIT file in the root directory of this source tree or the Apache
|
||||||
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
||||||
// of this source tree.
|
// of this source tree. You may select, at your option, one of the above-listed
|
||||||
|
// licenses.
|
||||||
|
|
||||||
mod cfrg_vectors;
|
mod cfrg_vectors;
|
||||||
mod mock_rng;
|
mod mock_rng;
|
||||||
|
|||||||
+8
-7
@@ -1,9 +1,10 @@
|
|||||||
// Copyright (c) Facebook, Inc. and its affiliates.
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
//
|
//
|
||||||
// This source code is licensed under both the MIT license found in the
|
// This source code is dual-licensed under either the MIT license found in the
|
||||||
// LICENSE-MIT file in the root directory of this source tree and the Apache
|
// LICENSE-MIT file in the root directory of this source tree or the Apache
|
||||||
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
||||||
// of this source tree.
|
// of this source tree. You may select, at your option, one of the above-listed
|
||||||
|
// licenses.
|
||||||
|
|
||||||
use alloc::string::{String, ToString};
|
use alloc::string::{String, ToString};
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
@@ -14,7 +15,7 @@ pub(crate) fn rfc_to_json(input: &str) -> String {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn parse_ciphersuites(input: &str) -> String {
|
fn parse_ciphersuites(input: &str) -> String {
|
||||||
let re = regex::Regex::new(r"\n## (?P<ciphersuite>.+?)\n").unwrap();
|
let re = regex::Regex::new(r"\nA\.\d\. (?P<ciphersuite>.+?)\n\n").unwrap();
|
||||||
let mut ciphersuites = vec![];
|
let mut ciphersuites = vec![];
|
||||||
|
|
||||||
let chunks: Vec<&str> = re.split(input).collect();
|
let chunks: Vec<&str> = re.split(input).collect();
|
||||||
@@ -33,7 +34,7 @@ fn parse_ciphersuites(input: &str) -> String {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn parse_modes(input: &str) -> String {
|
fn parse_modes(input: &str) -> String {
|
||||||
let re = regex::Regex::new(r"### (?P<mode>.*+) Mode").unwrap();
|
let re = regex::Regex::new(r"A\.\d.\d\. (?P<mode>.*?) Mode").unwrap();
|
||||||
let mut modes = vec![];
|
let mut modes = vec![];
|
||||||
|
|
||||||
let chunks: Vec<&str> = re.split(input).collect();
|
let chunks: Vec<&str> = re.split(input).collect();
|
||||||
@@ -52,7 +53,7 @@ fn parse_modes(input: &str) -> String {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn parse_vectors(input: &str) -> String {
|
fn parse_vectors(input: &str) -> String {
|
||||||
let re = regex::Regex::new(r"Test Vector.*+\n").unwrap();
|
let re = regex::Regex::new(r"A\.\d.\d\.\d\. Test Vector.*+\n").unwrap();
|
||||||
let mut vectors = vec![];
|
let mut vectors = vec![];
|
||||||
|
|
||||||
let chunks: Vec<&str> = re.split(input).collect();
|
let chunks: Vec<&str> = re.split(input).collect();
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
// Copyright (c) Facebook, Inc. and its affiliates.
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
//
|
//
|
||||||
// This source code is licensed under both the MIT license found in the
|
// This source code is dual-licensed under either the MIT license found in the
|
||||||
// LICENSE-MIT file in the root directory of this source tree and the Apache
|
// LICENSE-MIT file in the root directory of this source tree or the Apache
|
||||||
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
||||||
// of this source tree.
|
// of this source tree. You may select, at your option, one of the above-listed
|
||||||
|
// licenses.
|
||||||
|
|
||||||
use alloc::string::String;
|
use alloc::string::String;
|
||||||
use alloc::vec;
|
use alloc::vec;
|
||||||
@@ -88,6 +89,7 @@ macro_rules! json_to_test_vectors {
|
|||||||
fn test_vectors() -> Result<()> {
|
fn test_vectors() -> Result<()> {
|
||||||
use p256::NistP256;
|
use p256::NistP256;
|
||||||
use p384::NistP384;
|
use p384::NistP384;
|
||||||
|
use p521::NistP521;
|
||||||
|
|
||||||
let rfc: Value = serde_json::from_str(rfc_to_json(super::cfrg_vectors::VECTORS).as_str())
|
let rfc: Value = serde_json::from_str(rfc_to_json(super::cfrg_vectors::VECTORS).as_str())
|
||||||
.expect("Could not parse json");
|
.expect("Could not parse json");
|
||||||
@@ -187,6 +189,33 @@ fn test_vectors() -> Result<()> {
|
|||||||
test_poprf_finalize::<NistP384>(&p384_poprf_tvs)?;
|
test_poprf_finalize::<NistP384>(&p384_poprf_tvs)?;
|
||||||
test_poprf_evaluate::<NistP384>(&p384_poprf_tvs)?;
|
test_poprf_evaluate::<NistP384>(&p384_poprf_tvs)?;
|
||||||
|
|
||||||
|
let p521_oprf_tvs =
|
||||||
|
json_to_test_vectors!(rfc, String::from("P521-SHA512"), String::from("OPRF"));
|
||||||
|
assert_ne!(p521_oprf_tvs.len(), 0);
|
||||||
|
test_oprf_seed_to_key::<NistP521>(&p521_oprf_tvs)?;
|
||||||
|
test_oprf_blind::<NistP521>(&p521_oprf_tvs)?;
|
||||||
|
test_oprf_blind_evaluate::<NistP521>(&p521_oprf_tvs)?;
|
||||||
|
test_oprf_finalize::<NistP521>(&p521_oprf_tvs)?;
|
||||||
|
test_oprf_evaluate::<NistP521>(&p521_oprf_tvs)?;
|
||||||
|
|
||||||
|
let p521_voprf_tvs =
|
||||||
|
json_to_test_vectors!(rfc, String::from("P521-SHA512"), String::from("VOPRF"));
|
||||||
|
assert_ne!(p521_voprf_tvs.len(), 0);
|
||||||
|
test_voprf_seed_to_key::<NistP521>(&p521_voprf_tvs)?;
|
||||||
|
test_voprf_blind::<NistP521>(&p521_voprf_tvs)?;
|
||||||
|
test_voprf_blind_evaluate::<NistP521>(&p521_voprf_tvs)?;
|
||||||
|
test_voprf_finalize::<NistP521>(&p521_voprf_tvs)?;
|
||||||
|
test_voprf_evaluate::<NistP521>(&p521_voprf_tvs)?;
|
||||||
|
|
||||||
|
let p521_poprf_tvs =
|
||||||
|
json_to_test_vectors!(rfc, String::from("P521-SHA512"), String::from("POPRF"));
|
||||||
|
assert_ne!(p521_poprf_tvs.len(), 0);
|
||||||
|
test_poprf_seed_to_key::<NistP521>(&p521_poprf_tvs)?;
|
||||||
|
test_poprf_blind::<NistP521>(&p521_poprf_tvs)?;
|
||||||
|
test_poprf_blind_evaluate::<NistP521>(&p521_poprf_tvs)?;
|
||||||
|
test_poprf_finalize::<NistP521>(&p521_poprf_tvs)?;
|
||||||
|
test_poprf_evaluate::<NistP521>(&p521_poprf_tvs)?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+16
-5
@@ -1,9 +1,10 @@
|
|||||||
// Copyright (c) Facebook, Inc. and its affiliates.
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||||
//
|
//
|
||||||
// This source code is licensed under both the MIT license found in the
|
// This source code is dual-licensed under either the MIT license found in the
|
||||||
// LICENSE-MIT file in the root directory of this source tree and the Apache
|
// LICENSE-MIT file in the root directory of this source tree or the Apache
|
||||||
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
// License, Version 2.0 found in the LICENSE-APACHE file in the root directory
|
||||||
// of this source tree.
|
// of this source tree. You may select, at your option, one of the above-listed
|
||||||
|
// licenses.
|
||||||
|
|
||||||
//! Contains the main VOPRF API
|
//! Contains the main VOPRF API
|
||||||
|
|
||||||
@@ -536,7 +537,7 @@ where
|
|||||||
)?;
|
)?;
|
||||||
|
|
||||||
Ok(blinds
|
Ok(blinds
|
||||||
.zip(messages.into_iter())
|
.zip(messages)
|
||||||
.map(|(blind, x)| x.0 * &CS::Group::invert_scalar(blind)))
|
.map(|(blind, x)| x.0 * &CS::Group::invert_scalar(blind)))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -835,6 +836,7 @@ mod tests {
|
|||||||
fn test_functionality() -> Result<()> {
|
fn test_functionality() -> Result<()> {
|
||||||
use p256::NistP256;
|
use p256::NistP256;
|
||||||
use p384::NistP384;
|
use p384::NistP384;
|
||||||
|
use p521::NistP521;
|
||||||
|
|
||||||
#[cfg(feature = "ristretto255")]
|
#[cfg(feature = "ristretto255")]
|
||||||
{
|
{
|
||||||
@@ -868,6 +870,15 @@ mod tests {
|
|||||||
zeroize_voprf_client::<NistP384>();
|
zeroize_voprf_client::<NistP384>();
|
||||||
zeroize_voprf_server::<NistP384>();
|
zeroize_voprf_server::<NistP384>();
|
||||||
|
|
||||||
|
verifiable_retrieval::<NistP521>();
|
||||||
|
verifiable_batch_retrieval::<NistP521>();
|
||||||
|
verifiable_bad_public_key::<NistP521>();
|
||||||
|
verifiable_batch_bad_public_key::<NistP521>();
|
||||||
|
verifiable_server_evaluate::<NistP521>();
|
||||||
|
|
||||||
|
zeroize_voprf_client::<NistP521>();
|
||||||
|
zeroize_voprf_server::<NistP521>();
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user