Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 38 additions & 26 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,32 +115,44 @@ cargo run --bin uniffi-bindgen generate --library target/debug/libmfkdf2.dylib -
## Usage

```rust
use std::collections::HashMap;
use mfkdf2::{derive, setup};
use mfkdf2::setup::{factors::hotp::HOTPOptions, password::PasswordOptions, key::MFKDF2Options};
use mfkdf2::derive::factors::{hotp::HOTPOptions, password::PasswordOptions};

fn main() -> Result<(), Box<dyn std::error::Error>> {
// 1. Define factors
let password_factor = setup::password("my-super-secret-password", PasswordOptions::default())?;
let totp_factor = setup::hotp("base32-encoded-secret", HOTPOptions::default())?;

// 2. Set up the key with the policy
let key = setup::key(vec![password_factor, totp_factor], MFKDF2Options::default())?;

println!("Key: {:?}", key);

let factors = HashMap::from([
("password".to_string(), derive::factors::password("my-super-secret-password")?),
"hotp".to_string(), derive::factors::hotp("123456")?),
]);
// 3. Derive the key using user inputs
let derived_key = derive::key(&key.policy, factors, true, false)?;

println!("Derived Key: {:?}", derived_key);

Ok(())
}
# use std::collections::HashMap;
use mfkdf2::setup::factors::{totp::TOTPOptions, password::PasswordOptions};
use mfkdf2::definitions::MFKDF2Options;

let setup = mfkdf2::setup::key(
&[
mfkdf2::setup::factors::password("password1", PasswordOptions::default())?,
mfkdf2::setup::factors::totp(TOTPOptions {
secret: Some(b"abcdefghijklmnopqrst".to_vec()),
time: Some(1),
..Default::default()
})?,
],
MFKDF2Options::default(),
)?;

let derived_key = mfkdf2::derive::key(
&setup.policy,
HashMap::from([
("password".to_string(), mfkdf2::derive::factors::password("password1")?),
(
"totp".to_string(),
mfkdf2::derive::factors::totp(
241063,
Some(mfkdf2::derive::factors::totp::TOTPDeriveOptions {
time: Some(30001),
..Default::default()
}),
)?,
),
]),
true,
false,
)?;

println!("Derived Key: {:?}", derived_key);

# Ok::<(), mfkdf2::error::MFKDF2Error>(())
```

## Development
Expand Down
2 changes: 1 addition & 1 deletion mfkdf2-web/src/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import crypto from 'crypto';
import * as raw from './generated/web/mfkdf2.js';
export { uniffiInitAsync } from './index.web.js';
export { initRustLogging, LogLevel } from './generated/web/mfkdf2.js';
export { initLog, LogLevel } from './generated/web/mfkdf2.js';

// Re-export types
export type {
Expand Down
2 changes: 1 addition & 1 deletion mfkdf2-web/test/derive/key.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ suite('derive/key', () => {
.key(setup.policy, {
password1: await mfkdf.derive.factors.password('password1')
})
.should.be.rejectedWith(Mfkdf2Error.ShareRecoveryError)
.should.be.rejectedWith(Mfkdf2Error.ShareRecovery)
})
})

Expand Down
3 changes: 1 addition & 2 deletions mfkdf2-web/test/differential/derive.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ chai.use(chaiAsPromised);
chai.should();

import { suite, test } from 'mocha';
import { mfkdf as mfkdf2, uniffiInitAsync, initRustLogging, LogLevel } from '../../src/api';
import { mfkdf as mfkdf2, uniffiInitAsync } from '../../src/api';
import { derivedKeyIsEqual } from './validation';

import mfkdf from 'mfkdf';
Expand All @@ -16,7 +16,6 @@ suite('differential/derive', () => {
// Initialize UniFFI once before all tests
before(async () => {
await uniffiInitAsync();
await initRustLogging(LogLevel.Debug);
});

// each factor individually with single factor
Expand Down
3 changes: 1 addition & 2 deletions mfkdf2-web/test/differential/policy.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ chai.use(chaiAsPromised);
chai.should();

import { suite, test } from 'mocha';
import mfkdf2, { initRustLogging, LogLevel, uniffiInitAsync } from '../../src/api';
import mfkdf2, { uniffiInitAsync } from '../../src/api';
import { Mfkdf2Error } from '../../src/generated/web/mfkdf2.js';
import mfkdf from 'mfkdf';
import { derivedKeyIsEqual } from './validation';
Expand All @@ -14,7 +14,6 @@ suite('differential/policy', () => {
// Initialize UniFFI once before all tests
before(async () => {
await uniffiInitAsync();
await initRustLogging(LogLevel.Debug);
});

suite('validate', () => {
Expand Down
4 changes: 2 additions & 2 deletions mfkdf2-web/test/differential/reconstitution.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ suite('differential/reconstitution', () => {
},
false
)
.should.be.rejectedWith(Mfkdf2Error.ShareRecoveryError);
.should.be.rejectedWith(Mfkdf2Error.ShareRecovery);

await setup2.setThreshold(2);

Expand Down Expand Up @@ -207,7 +207,7 @@ suite('differential/reconstitution', () => {
password1: await mfkdf2.derive.factors.password('password1'),
password4: await mfkdf2.derive.factors.password('password4')
})
.should.be.rejectedWith(Mfkdf2Error.ShareRecoveryError);
.should.be.rejectedWith(Mfkdf2Error.ShareRecovery);

const d5 = await mfkdf.derive.key(setup.policy, {
password2: await mfkdf.derive.factors.password('password2'),
Expand Down
8 changes: 4 additions & 4 deletions mfkdf2-web/test/features/reconstitution.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ suite('features/reconstitution', () => {
},
false
)
.should.be.rejectedWith(Mfkdf2Error.ShareRecoveryError);
.should.be.rejectedWith(Mfkdf2Error.ShareRecovery);

await setup.setThreshold(2);

Expand Down Expand Up @@ -82,7 +82,7 @@ suite('features/reconstitution', () => {
password1: await mfkdf.derive.factors.password('password1'),
password2: await mfkdf.derive.factors.password('password2')
})
.should.be.rejectedWith(Mfkdf2Error.ShareRecoveryError)
.should.be.rejectedWith(Mfkdf2Error.ShareRecovery)

await derive2.removeFactor('password2').should.be.rejectedWith(Mfkdf2Error.InvalidThreshold)

Expand All @@ -99,7 +99,7 @@ suite('features/reconstitution', () => {
.key(derive2.policy, {
password2: await mfkdf.derive.factors.password('password2')
})
.should.be.rejectedWith(Mfkdf2Error.ShareRecoveryError)
.should.be.rejectedWith(Mfkdf2Error.ShareRecovery)
})

test('removeFactors', async () => {
Expand Down Expand Up @@ -133,7 +133,7 @@ suite('features/reconstitution', () => {
password1: await mfkdf.derive.factors.password('password1'),
password4: await mfkdf.derive.factors.password('password4')
})
.should.be.rejectedWith(Mfkdf2Error.ShareRecoveryError)
.should.be.rejectedWith(Mfkdf2Error.ShareRecovery)

const derive3 = await mfkdf.derive.key(setup.policy, {
password2: await mfkdf.derive.factors.password('password2'),
Expand Down
3 changes: 3 additions & 0 deletions mfkdf2/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -159,3 +159,6 @@ default = []
# Enable UniFFI bindings (FFI exports, scaffolding, bin, etc.)
bindings = ["dep:uniffi"]
differential-test = []

[package.metadata.docs.rs]
rustdoc-args = ["--html-in-header", "katex-header.html"]
Loading