Skip to content

Add kem trait impls when ECDH is supported - #1556

Closed
incertia wants to merge 2 commits into
RustCrypto:masterfrom
trailofbits:ecdh-kem
Closed

Add kem trait impls when ECDH is supported#1556
incertia wants to merge 2 commits into
RustCrypto:masterfrom
trailofbits:ecdh-kem

Conversation

@incertia

Copy link
Copy Markdown

This will allow easy integration of the generic TLS 1.3 KEM combiner, since the current plan is to take any two KEMs that support Encapsulate/Decapsulate and combine them piecewise, and this turns the DH implementations into a KEM as described by TLS. I wonder if this should go into KEMs instead, however.

@tarcieri

Copy link
Copy Markdown
Member

...KEM as described by TLS.

It would be good to specifically call it out as such, and add test vectors.

I wonder if this should go into KEMs instead, however.

Yes, that'd probably be a good idea. I went ahead and snagged the dhkem crate if you'd like to open a PR there.

@incertia

Copy link
Copy Markdown
Author

add test vectors.

does this mean adding generic randomized round trip tests or are there test vectors that I'm unaware of?

Yes, that'd probably be a good idea. I went ahead and snagged the dhkem crate if you'd like to open a PR there.

One issue here is that Rust would treat this as an impl of a foreign trait on a foreign type which is forbidden the last time I checked. The impl would have to be proxied. Something along the lines of

struct<X> Proxy(x:X);impl<C>Encapsulate<EK,SS>forProxy<EphemeralSecret<C>>whereC:CurveArithmetic{}

which may not be entirely desirable. Let me know what you think.

@incertia

Copy link
Copy Markdown
Author

The impl would have to be proxied.

One upside here is that we might be able to bundle the DH-KEMs from a variety of providers, probably through an enum?

In particular since X25519-dalek does not implement the elliptic-curve traits to my knowledge, at least one proxy implementation must be written to get X25519Kyber768Draft00 implemented as a generic combiner.

@tarcieri

tarcieri commented Apr 17, 2024

Copy link
Copy Markdown
Member

The impl would have to be proxied.

Yes, you'd need newtypes for encapsulators/decapsulators.

One upside here is that we might be able to bundle the DH-KEMs from a variety of providers, probably through an enum?

We generally use traits, not enums, to support multiple providers. Enums have a number of drawbacks, such as preventing downstream crates from integrating, and also always linking all of the associated code for all providers whether they're used or not, whereas traits are friendly to dead code elimination.

In particular since X25519-dalek does not implement the elliptic-curve traits to my knowledge

curve25519-dalek supports traits from the group crate, although they're probably only impl'd for EdwardsPoint and not MontgomeryPoint.

That's a problem that could potentially be remedied upstream.

Sign up for freeto 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.

2 participants

@incertia@tarcieri
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Add kem trait impls when ECDH is supported by incertia · Pull Request #1556 · RustCrypto/traits · GitHub
Skip to content

Add kem trait impls when ECDH is supported - #1556

Closed
incertia wants to merge 2 commits into
RustCrypto:masterfrom
trailofbits:ecdh-kem
Closed

Add kem trait impls when ECDH is supported#1556
incertia wants to merge 2 commits into
RustCrypto:masterfrom
trailofbits:ecdh-kem

Conversation

@incertia

Copy link
Copy Markdown

This will allow easy integration of the generic TLS 1.3 KEM combiner, since the current plan is to take any two KEMs that support Encapsulate/Decapsulate and combine them piecewise, and this turns the DH implementations into a KEM as described by TLS. I wonder if this should go into KEMs instead, however.

@tarcieri

Copy link
Copy Markdown
Member

...KEM as described by TLS.

It would be good to specifically call it out as such, and add test vectors.

I wonder if this should go into KEMs instead, however.

Yes, that'd probably be a good idea. I went ahead and snagged the dhkem crate if you'd like to open a PR there.

@incertia

Copy link
Copy Markdown
Author

add test vectors.

does this mean adding generic randomized round trip tests or are there test vectors that I'm unaware of?

Yes, that'd probably be a good idea. I went ahead and snagged the dhkem crate if you'd like to open a PR there.

One issue here is that Rust would treat this as an impl of a foreign trait on a foreign type which is forbidden the last time I checked. The impl would have to be proxied. Something along the lines of

struct<X> Proxy(x:X);impl<C>Encapsulate<EK,SS>forProxy<EphemeralSecret<C>>whereC:CurveArithmetic{}

which may not be entirely desirable. Let me know what you think.

@incertia

Copy link
Copy Markdown
Author

The impl would have to be proxied.

One upside here is that we might be able to bundle the DH-KEMs from a variety of providers, probably through an enum?

In particular since X25519-dalek does not implement the elliptic-curve traits to my knowledge, at least one proxy implementation must be written to get X25519Kyber768Draft00 implemented as a generic combiner.

@tarcieri

tarcieri commented Apr 17, 2024

Copy link
Copy Markdown
Member

The impl would have to be proxied.

Yes, you'd need newtypes for encapsulators/decapsulators.

One upside here is that we might be able to bundle the DH-KEMs from a variety of providers, probably through an enum?

We generally use traits, not enums, to support multiple providers. Enums have a number of drawbacks, such as preventing downstream crates from integrating, and also always linking all of the associated code for all providers whether they're used or not, whereas traits are friendly to dead code elimination.

In particular since X25519-dalek does not implement the elliptic-curve traits to my knowledge

curve25519-dalek supports traits from the group crate, although they're probably only impl'd for EdwardsPoint and not MontgomeryPoint.

That's a problem that could potentially be remedied upstream.

Sign up for freeto 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.

2 participants

@incertia@tarcieri
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add kem trait impls when ECDH is supported by incertia · Pull Request #1556 · RustCrypto/traits · GitHub
Skip to content

Add kem trait impls when ECDH is supported - #1556

Closed
incertia wants to merge 2 commits into
RustCrypto:masterfrom
trailofbits:ecdh-kem
Closed

Add kem trait impls when ECDH is supported#1556
incertia wants to merge 2 commits into
RustCrypto:masterfrom
trailofbits:ecdh-kem

Conversation

@incertia

Copy link
Copy Markdown

This will allow easy integration of the generic TLS 1.3 KEM combiner, since the current plan is to take any two KEMs that support Encapsulate/Decapsulate and combine them piecewise, and this turns the DH implementations into a KEM as described by TLS. I wonder if this should go into KEMs instead, however.

@tarcieri

Copy link
Copy Markdown
Member

...KEM as described by TLS.

It would be good to specifically call it out as such, and add test vectors.

I wonder if this should go into KEMs instead, however.

Yes, that'd probably be a good idea. I went ahead and snagged the dhkem crate if you'd like to open a PR there.

@incertia

Copy link
Copy Markdown
Author

add test vectors.

does this mean adding generic randomized round trip tests or are there test vectors that I'm unaware of?

Yes, that'd probably be a good idea. I went ahead and snagged the dhkem crate if you'd like to open a PR there.

One issue here is that Rust would treat this as an impl of a foreign trait on a foreign type which is forbidden the last time I checked. The impl would have to be proxied. Something along the lines of

struct<X> Proxy(x:X);impl<C>Encapsulate<EK,SS>forProxy<EphemeralSecret<C>>whereC:CurveArithmetic{}

which may not be entirely desirable. Let me know what you think.

@incertia

Copy link
Copy Markdown
Author

The impl would have to be proxied.

One upside here is that we might be able to bundle the DH-KEMs from a variety of providers, probably through an enum?

In particular since X25519-dalek does not implement the elliptic-curve traits to my knowledge, at least one proxy implementation must be written to get X25519Kyber768Draft00 implemented as a generic combiner.

@tarcieri

tarcieri commented Apr 17, 2024

Copy link
Copy Markdown
Member

The impl would have to be proxied.

Yes, you'd need newtypes for encapsulators/decapsulators.

One upside here is that we might be able to bundle the DH-KEMs from a variety of providers, probably through an enum?

We generally use traits, not enums, to support multiple providers. Enums have a number of drawbacks, such as preventing downstream crates from integrating, and also always linking all of the associated code for all providers whether they're used or not, whereas traits are friendly to dead code elimination.

In particular since X25519-dalek does not implement the elliptic-curve traits to my knowledge

curve25519-dalek supports traits from the group crate, although they're probably only impl'd for EdwardsPoint and not MontgomeryPoint.

That's a problem that could potentially be remedied upstream.

Sign up for freeto 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.

2 participants

@incertia@tarcieri
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add kem trait impls when ECDH is supported by incertia · Pull Request #1556 · RustCrypto/traits · GitHub
Skip to content

Add kem trait impls when ECDH is supported - #1556

Closed
incertia wants to merge 2 commits into
RustCrypto:masterfrom
trailofbits:ecdh-kem
Closed

Add kem trait impls when ECDH is supported#1556
incertia wants to merge 2 commits into
RustCrypto:masterfrom
trailofbits:ecdh-kem

Conversation

@incertia

Copy link
Copy Markdown

This will allow easy integration of the generic TLS 1.3 KEM combiner, since the current plan is to take any two KEMs that support Encapsulate/Decapsulate and combine them piecewise, and this turns the DH implementations into a KEM as described by TLS. I wonder if this should go into KEMs instead, however.

@tarcieri

Copy link
Copy Markdown
Member

...KEM as described by TLS.

It would be good to specifically call it out as such, and add test vectors.

I wonder if this should go into KEMs instead, however.

Yes, that'd probably be a good idea. I went ahead and snagged the dhkem crate if you'd like to open a PR there.

@incertia

Copy link
Copy Markdown
Author

add test vectors.

does this mean adding generic randomized round trip tests or are there test vectors that I'm unaware of?

Yes, that'd probably be a good idea. I went ahead and snagged the dhkem crate if you'd like to open a PR there.

One issue here is that Rust would treat this as an impl of a foreign trait on a foreign type which is forbidden the last time I checked. The impl would have to be proxied. Something along the lines of

struct<X> Proxy(x:X);impl<C>Encapsulate<EK,SS>forProxy<EphemeralSecret<C>>whereC:CurveArithmetic{}

which may not be entirely desirable. Let me know what you think.

@incertia

Copy link
Copy Markdown
Author

The impl would have to be proxied.

One upside here is that we might be able to bundle the DH-KEMs from a variety of providers, probably through an enum?

In particular since X25519-dalek does not implement the elliptic-curve traits to my knowledge, at least one proxy implementation must be written to get X25519Kyber768Draft00 implemented as a generic combiner.

@tarcieri

tarcieri commented Apr 17, 2024

Copy link
Copy Markdown
Member

The impl would have to be proxied.

Yes, you'd need newtypes for encapsulators/decapsulators.

One upside here is that we might be able to bundle the DH-KEMs from a variety of providers, probably through an enum?

We generally use traits, not enums, to support multiple providers. Enums have a number of drawbacks, such as preventing downstream crates from integrating, and also always linking all of the associated code for all providers whether they're used or not, whereas traits are friendly to dead code elimination.

In particular since X25519-dalek does not implement the elliptic-curve traits to my knowledge

curve25519-dalek supports traits from the group crate, although they're probably only impl'd for EdwardsPoint and not MontgomeryPoint.

That's a problem that could potentially be remedied upstream.

Sign up for freeto 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.

2 participants

@incertia@tarcieri
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Add kem trait impls when ECDH is supported by incertia · Pull Request #1556 · RustCrypto/traits · GitHub
Skip to content

Add kem trait impls when ECDH is supported - #1556

Closed
incertia wants to merge 2 commits into
RustCrypto:masterfrom
trailofbits:ecdh-kem
Closed

Add kem trait impls when ECDH is supported#1556
incertia wants to merge 2 commits into
RustCrypto:masterfrom
trailofbits:ecdh-kem

Conversation

@incertia

Copy link
Copy Markdown

This will allow easy integration of the generic TLS 1.3 KEM combiner, since the current plan is to take any two KEMs that support Encapsulate/Decapsulate and combine them piecewise, and this turns the DH implementations into a KEM as described by TLS. I wonder if this should go into KEMs instead, however.

@tarcieri

Copy link
Copy Markdown
Member

...KEM as described by TLS.

It would be good to specifically call it out as such, and add test vectors.

I wonder if this should go into KEMs instead, however.

Yes, that'd probably be a good idea. I went ahead and snagged the dhkem crate if you'd like to open a PR there.

@incertia

Copy link
Copy Markdown
Author

add test vectors.

does this mean adding generic randomized round trip tests or are there test vectors that I'm unaware of?

Yes, that'd probably be a good idea. I went ahead and snagged the dhkem crate if you'd like to open a PR there.

One issue here is that Rust would treat this as an impl of a foreign trait on a foreign type which is forbidden the last time I checked. The impl would have to be proxied. Something along the lines of

struct<X> Proxy(x:X);impl<C>Encapsulate<EK,SS>forProxy<EphemeralSecret<C>>whereC:CurveArithmetic{}

which may not be entirely desirable. Let me know what you think.

@incertia

Copy link
Copy Markdown
Author

The impl would have to be proxied.

One upside here is that we might be able to bundle the DH-KEMs from a variety of providers, probably through an enum?

In particular since X25519-dalek does not implement the elliptic-curve traits to my knowledge, at least one proxy implementation must be written to get X25519Kyber768Draft00 implemented as a generic combiner.

@tarcieri

tarcieri commented Apr 17, 2024

Copy link
Copy Markdown
Member

The impl would have to be proxied.

Yes, you'd need newtypes for encapsulators/decapsulators.

One upside here is that we might be able to bundle the DH-KEMs from a variety of providers, probably through an enum?

We generally use traits, not enums, to support multiple providers. Enums have a number of drawbacks, such as preventing downstream crates from integrating, and also always linking all of the associated code for all providers whether they're used or not, whereas traits are friendly to dead code elimination.

In particular since X25519-dalek does not implement the elliptic-curve traits to my knowledge

curve25519-dalek supports traits from the group crate, although they're probably only impl'd for EdwardsPoint and not MontgomeryPoint.

That's a problem that could potentially be remedied upstream.

Sign up for freeto 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.

2 participants

@incertia@tarcieri
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add kem trait impls when ECDH is supported by incertia · Pull Request #1556 · RustCrypto/traits · GitHub
Skip to content

Add kem trait impls when ECDH is supported - #1556

Closed
incertia wants to merge 2 commits into
RustCrypto:masterfrom
trailofbits:ecdh-kem
Closed

Add kem trait impls when ECDH is supported#1556
incertia wants to merge 2 commits into
RustCrypto:masterfrom
trailofbits:ecdh-kem

Conversation

@incertia

Copy link
Copy Markdown

This will allow easy integration of the generic TLS 1.3 KEM combiner, since the current plan is to take any two KEMs that support Encapsulate/Decapsulate and combine them piecewise, and this turns the DH implementations into a KEM as described by TLS. I wonder if this should go into KEMs instead, however.

@tarcieri

Copy link
Copy Markdown
Member

...KEM as described by TLS.

It would be good to specifically call it out as such, and add test vectors.

I wonder if this should go into KEMs instead, however.

Yes, that'd probably be a good idea. I went ahead and snagged the dhkem crate if you'd like to open a PR there.

@incertia

Copy link
Copy Markdown
Author

add test vectors.

does this mean adding generic randomized round trip tests or are there test vectors that I'm unaware of?

Yes, that'd probably be a good idea. I went ahead and snagged the dhkem crate if you'd like to open a PR there.

One issue here is that Rust would treat this as an impl of a foreign trait on a foreign type which is forbidden the last time I checked. The impl would have to be proxied. Something along the lines of

struct<X> Proxy(x:X);impl<C>Encapsulate<EK,SS>forProxy<EphemeralSecret<C>>whereC:CurveArithmetic{}

which may not be entirely desirable. Let me know what you think.

@incertia

Copy link
Copy Markdown
Author

The impl would have to be proxied.

One upside here is that we might be able to bundle the DH-KEMs from a variety of providers, probably through an enum?

In particular since X25519-dalek does not implement the elliptic-curve traits to my knowledge, at least one proxy implementation must be written to get X25519Kyber768Draft00 implemented as a generic combiner.

@tarcieri

tarcieri commented Apr 17, 2024

Copy link
Copy Markdown
Member

The impl would have to be proxied.

Yes, you'd need newtypes for encapsulators/decapsulators.

One upside here is that we might be able to bundle the DH-KEMs from a variety of providers, probably through an enum?

We generally use traits, not enums, to support multiple providers. Enums have a number of drawbacks, such as preventing downstream crates from integrating, and also always linking all of the associated code for all providers whether they're used or not, whereas traits are friendly to dead code elimination.

In particular since X25519-dalek does not implement the elliptic-curve traits to my knowledge

curve25519-dalek supports traits from the group crate, although they're probably only impl'd for EdwardsPoint and not MontgomeryPoint.

That's a problem that could potentially be remedied upstream.

Sign up for freeto 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.

2 participants

@incertia@tarcieri
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); Add kem trait impls when ECDH is supported by incertia · Pull Request #1556 · RustCrypto/traits · GitHub
Skip to content

Add kem trait impls when ECDH is supported - #1556

Closed
incertia wants to merge 2 commits into
RustCrypto:masterfrom
trailofbits:ecdh-kem
Closed

Add kem trait impls when ECDH is supported#1556
incertia wants to merge 2 commits into
RustCrypto:masterfrom
trailofbits:ecdh-kem

Conversation

@incertia

Copy link
Copy Markdown

This will allow easy integration of the generic TLS 1.3 KEM combiner, since the current plan is to take any two KEMs that support Encapsulate/Decapsulate and combine them piecewise, and this turns the DH implementations into a KEM as described by TLS. I wonder if this should go into KEMs instead, however.

@tarcieri

Copy link
Copy Markdown
Member

...KEM as described by TLS.

It would be good to specifically call it out as such, and add test vectors.

I wonder if this should go into KEMs instead, however.

Yes, that'd probably be a good idea. I went ahead and snagged the dhkem crate if you'd like to open a PR there.

@incertia

Copy link
Copy Markdown
Author

add test vectors.

does this mean adding generic randomized round trip tests or are there test vectors that I'm unaware of?

Yes, that'd probably be a good idea. I went ahead and snagged the dhkem crate if you'd like to open a PR there.

One issue here is that Rust would treat this as an impl of a foreign trait on a foreign type which is forbidden the last time I checked. The impl would have to be proxied. Something along the lines of

struct<X> Proxy(x:X);impl<C>Encapsulate<EK,SS>forProxy<EphemeralSecret<C>>whereC:CurveArithmetic{}

which may not be entirely desirable. Let me know what you think.

@incertia

Copy link
Copy Markdown
Author

The impl would have to be proxied.

One upside here is that we might be able to bundle the DH-KEMs from a variety of providers, probably through an enum?

In particular since X25519-dalek does not implement the elliptic-curve traits to my knowledge, at least one proxy implementation must be written to get X25519Kyber768Draft00 implemented as a generic combiner.

@tarcieri

tarcieri commented Apr 17, 2024

Copy link
Copy Markdown
Member

The impl would have to be proxied.

Yes, you'd need newtypes for encapsulators/decapsulators.

One upside here is that we might be able to bundle the DH-KEMs from a variety of providers, probably through an enum?

We generally use traits, not enums, to support multiple providers. Enums have a number of drawbacks, such as preventing downstream crates from integrating, and also always linking all of the associated code for all providers whether they're used or not, whereas traits are friendly to dead code elimination.

In particular since X25519-dalek does not implement the elliptic-curve traits to my knowledge

curve25519-dalek supports traits from the group crate, although they're probably only impl'd for EdwardsPoint and not MontgomeryPoint.

That's a problem that could potentially be remedied upstream.

Sign up for freeto 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.

2 participants

@incertia@tarcieri