Skip to content

Document and test maximum deriveBits length for ECDH curves#249

Open
harrshita123 wants to merge 3 commits intogoogle:masterfrom
harrshita123:issue-130-ecdh-derivebits-docs
Open

Document and test maximum deriveBits length for ECDH curves#249
harrshita123 wants to merge 3 commits intogoogle:masterfrom
harrshita123:issue-130-ecdh-derivebits-docs

Conversation

@harrshita123
Copy link
Copy Markdown
Contributor

This PR adds documentation clarifying the maximum number of bits that can be derived using EcdhPrivateKey.deriveBits for each supported elliptic curve.

It also includes tests to ensure that deriving the maximum allowed length succeeds and that requests exceeding the limit are correctly rejected.

Fixes #130

Comment thread lib/src/webcrypto/webcrypto.ecdh.dart Outdated
Co-authored-by: HamdaanAliQuatil <96776914+HamdaanAliQuatil@users.noreply.github.com>

expect(
aliceKeyPair.privateKey.deriveBits(257, bobKeyPair.publicKey),
throwsA(anyOf(isA<subtle.JSDomException>(), isA<Error>())),
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, this implies a different kind of issue.

I think we are supposed to catch JSDomException and make it into an Exception or an Error.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To be clear that is probably an orthogonal issue to this PR and should be fixed separately.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

since it’s kind of a separate thing, I will leave it out of this PR for now so this doesn’t get messy. I can open a new issue for the JSDomException part if needed.

@jonasfj
Copy link
Copy Markdown
Member

jonasfj commented Apr 24, 2026

Please rebase, I think CI mostly works on master branch now.

@harrshita123
Copy link
Copy Markdown
Contributor Author

Please rebase, I think CI mostly works on master branch now.

I have rebased the branch onto the latest master so the CI tests can run properly.

});
});
group('ECDH deriveBits', () {
test('P-256 allows maximum deriveBits length', () async {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These tests should decidedly not live in test/crypto_subtle_test.dart --- this tests the subtle.window.crypto.subtle wrapper we have.

I suggest we put them in lib/src/testing/ecdh/derive_bits.dart or test/ecdh_derive_bits_test.dart (they won't be included in integration tests, but maybe that's okay -- we can always move them later, and getting coverage is probably better).


I don't mind these tests, but they could also be made much simpler.

final _cases = [
  (
    name: 'P-256',
    curve: EllipticCurve.p256,
    maxBits: 256,
  ),
  ...
];

void main() {
  for (final c in _cases) {
    test('${c.name} allows maximum deriveBits length', () async {
      final aliceKeyPair = await EcdhPrivateKey.generateKey(c.curve);
      final bobKeyPair = await EcdhPrivateKey.generateKey(c.curve);

      final secret = await aliceKeyPair.privateKey.deriveBits(
        c.maxBits,
        bobKeyPair.publicKey,
      );

      expect(secret.length, equals(c.maxBits / 8));
    });

    test('${c.name} rejects deriveBits larger than maximum', () async {
      final aliceKeyPair = await EcdhPrivateKey.generateKey(c.curve);
      final bobKeyPair = await EcdhPrivateKey.generateKey(c.curve);

      expect(
        aliceKeyPair.privateKey.deriveBits(c.maxBits + 1, bobKeyPair.publicKey),
        throwsA(anyOf(isA<subtle.JSDomException>(), isA<Error>())), 
      );
    });
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Document the maximum length in EcdhPrivateKey.deriveBits for each curve

3 participants