feat: Add sha512 precompiles - #179

Merged
wwared merged 10 commits into
devfrom
sha512_gadgets
Sep 30, 2024
Merged

feat: Add sha512 precompiles#179
wwared merged 10 commits into
devfrom
sha512_gadgets

Conversation

@wwared

@wwaredwwared commented Sep 27, 2024

Copy link
Copy Markdown
Contributor

Companion PR: argumentcomputer/RustCrypto-hashes#1 and argumentcomputer/zk-light-clients#256

This PR adds two new syscalls, for SHA-512 extend and compress operations.

Due to the large amount of byte lookups performed per instruction, these instructions all perform a single iteration of the main loop of its corresponding iteration. This means the library code must call these in a loop to perform the entire operation (see the companion PR for how that is done).

Additionally, this PR adds the following types and operations geared towards 64-bit words:

  • Word64<T>, the 64-bit variant of Word<T>
  • Add64Operation, Xor64Operation, And64Operation, Not64Operation: trivial 64-bit variants of their 32-bit counterparts
  • FixedRotateRight64Operation and FixedShiftRight64Operation: the 64-bit counterpart to the 32-bit operations. Required minor changes compared to the 32-bit version

It should be possible to make the above types more generic in the future (for example, making Word<T> generic over the word width), but this would make the PR modify much more of the codebase than it does, just for minor type changes around these operations. Making new operations based on the existing ones is the simpler option that makes it clear where and how these operations are used.

These versions are essentially just copies of their 32-bit counterparts,
made to work with a Word64 type. It's not as nice as a fully generic
version
Also add Xor64 operation, fix typo in Add64, add simple test
adr1anh
adr1anh previously approved these changes Sep 30, 2024

@adr1anhadr1anh left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

There are a few things that could be optimized, but that can be done at a later time. Nice work!

Comment threadcore/src/air/word_64.rs Outdated
local.is_real,
);
let reduced_prev_i = local.i_mem.prev_value().reduce::<AB>();
builder

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We should be able to trust i since it's coming from the Rust code that calls compress

);

// Calculate temp1 := h + S1 + ch + k[i] + w[i].
Add64Operation::<AB::F>::eval(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Just making a note, but the Add operation does not need to range check the inputs since we can assume they are bytes (either as an XOR result or because they come from the ZKVM)

);

// Calculate temp1 := h + S1 + ch + k[i] + w[i].
Add64Operation::<AB::F>::eval(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We could also use an Add4 gadget

Not very useful considering it will almost always overflow. Can be added
back if necessary.
@wwaredwwared mentioned this pull request Sep 30, 2024
@wwared
wwared marked this pull request as ready for review September 30, 2024 13:42

@storojs72storojs72 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@wwared
wwared merged commit 75d6e85 into devSep 30, 2024
@wwared
wwared deleted the sha512_gadgets branch September 30, 2024 16:20
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.

3 participants

@wwared@adr1anh@storojs72
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: Add sha512 precompiles - #179

Merged
wwared merged 10 commits into
devfrom
sha512_gadgets
Sep 30, 2024
Merged

feat: Add sha512 precompiles#179
wwared merged 10 commits into
devfrom
sha512_gadgets

Conversation

@wwared

@wwaredwwared commented Sep 27, 2024

Copy link
Copy Markdown
Contributor

Companion PR: argumentcomputer/RustCrypto-hashes#1 and argumentcomputer/zk-light-clients#256

This PR adds two new syscalls, for SHA-512 extend and compress operations.

Due to the large amount of byte lookups performed per instruction, these instructions all perform a single iteration of the main loop of its corresponding iteration. This means the library code must call these in a loop to perform the entire operation (see the companion PR for how that is done).

Additionally, this PR adds the following types and operations geared towards 64-bit words:

  • Word64<T>, the 64-bit variant of Word<T>
  • Add64Operation, Xor64Operation, And64Operation, Not64Operation: trivial 64-bit variants of their 32-bit counterparts
  • FixedRotateRight64Operation and FixedShiftRight64Operation: the 64-bit counterpart to the 32-bit operations. Required minor changes compared to the 32-bit version

It should be possible to make the above types more generic in the future (for example, making Word<T> generic over the word width), but this would make the PR modify much more of the codebase than it does, just for minor type changes around these operations. Making new operations based on the existing ones is the simpler option that makes it clear where and how these operations are used.

These versions are essentially just copies of their 32-bit counterparts,
made to work with a Word64 type. It's not as nice as a fully generic
version
Also add Xor64 operation, fix typo in Add64, add simple test
adr1anh
adr1anh previously approved these changes Sep 30, 2024

@adr1anhadr1anh left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

There are a few things that could be optimized, but that can be done at a later time. Nice work!

Comment threadcore/src/air/word_64.rs Outdated
local.is_real,
);
let reduced_prev_i = local.i_mem.prev_value().reduce::<AB>();
builder

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We should be able to trust i since it's coming from the Rust code that calls compress

);

// Calculate temp1 := h + S1 + ch + k[i] + w[i].
Add64Operation::<AB::F>::eval(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Just making a note, but the Add operation does not need to range check the inputs since we can assume they are bytes (either as an XOR result or because they come from the ZKVM)

);

// Calculate temp1 := h + S1 + ch + k[i] + w[i].
Add64Operation::<AB::F>::eval(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We could also use an Add4 gadget

Not very useful considering it will almost always overflow. Can be added
back if necessary.
@wwaredwwared mentioned this pull request Sep 30, 2024
@wwared
wwared marked this pull request as ready for review September 30, 2024 13:42

@storojs72storojs72 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@wwared
wwared merged commit 75d6e85 into devSep 30, 2024
@wwared
wwared deleted the sha512_gadgets branch September 30, 2024 16:20
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.

3 participants

@wwared@adr1anh@storojs72
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: Add sha512 precompiles - #179

Merged
wwared merged 10 commits into
devfrom
sha512_gadgets
Sep 30, 2024
Merged

feat: Add sha512 precompiles#179
wwared merged 10 commits into
devfrom
sha512_gadgets

Conversation

@wwared

@wwaredwwared commented Sep 27, 2024

Copy link
Copy Markdown
Contributor

Companion PR: argumentcomputer/RustCrypto-hashes#1 and argumentcomputer/zk-light-clients#256

This PR adds two new syscalls, for SHA-512 extend and compress operations.

Due to the large amount of byte lookups performed per instruction, these instructions all perform a single iteration of the main loop of its corresponding iteration. This means the library code must call these in a loop to perform the entire operation (see the companion PR for how that is done).

Additionally, this PR adds the following types and operations geared towards 64-bit words:

  • Word64<T>, the 64-bit variant of Word<T>
  • Add64Operation, Xor64Operation, And64Operation, Not64Operation: trivial 64-bit variants of their 32-bit counterparts
  • FixedRotateRight64Operation and FixedShiftRight64Operation: the 64-bit counterpart to the 32-bit operations. Required minor changes compared to the 32-bit version

It should be possible to make the above types more generic in the future (for example, making Word<T> generic over the word width), but this would make the PR modify much more of the codebase than it does, just for minor type changes around these operations. Making new operations based on the existing ones is the simpler option that makes it clear where and how these operations are used.

These versions are essentially just copies of their 32-bit counterparts,
made to work with a Word64 type. It's not as nice as a fully generic
version
Also add Xor64 operation, fix typo in Add64, add simple test
adr1anh
adr1anh previously approved these changes Sep 30, 2024

@adr1anhadr1anh left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

There are a few things that could be optimized, but that can be done at a later time. Nice work!

Comment threadcore/src/air/word_64.rs Outdated
local.is_real,
);
let reduced_prev_i = local.i_mem.prev_value().reduce::<AB>();
builder

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We should be able to trust i since it's coming from the Rust code that calls compress

);

// Calculate temp1 := h + S1 + ch + k[i] + w[i].
Add64Operation::<AB::F>::eval(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Just making a note, but the Add operation does not need to range check the inputs since we can assume they are bytes (either as an XOR result or because they come from the ZKVM)

);

// Calculate temp1 := h + S1 + ch + k[i] + w[i].
Add64Operation::<AB::F>::eval(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We could also use an Add4 gadget

Not very useful considering it will almost always overflow. Can be added
back if necessary.
@wwaredwwared mentioned this pull request Sep 30, 2024
@wwared
wwared marked this pull request as ready for review September 30, 2024 13:42

@storojs72storojs72 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@wwared
wwared merged commit 75d6e85 into devSep 30, 2024
@wwared
wwared deleted the sha512_gadgets branch September 30, 2024 16:20
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.

3 participants

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

feat: Add sha512 precompiles - #179

Merged
wwared merged 10 commits into
devfrom
sha512_gadgets
Sep 30, 2024
Merged

feat: Add sha512 precompiles#179
wwared merged 10 commits into
devfrom
sha512_gadgets

Conversation

@wwared

@wwaredwwared commented Sep 27, 2024

Copy link
Copy Markdown
Contributor

Companion PR: argumentcomputer/RustCrypto-hashes#1 and argumentcomputer/zk-light-clients#256

This PR adds two new syscalls, for SHA-512 extend and compress operations.

Due to the large amount of byte lookups performed per instruction, these instructions all perform a single iteration of the main loop of its corresponding iteration. This means the library code must call these in a loop to perform the entire operation (see the companion PR for how that is done).

Additionally, this PR adds the following types and operations geared towards 64-bit words:

  • Word64<T>, the 64-bit variant of Word<T>
  • Add64Operation, Xor64Operation, And64Operation, Not64Operation: trivial 64-bit variants of their 32-bit counterparts
  • FixedRotateRight64Operation and FixedShiftRight64Operation: the 64-bit counterpart to the 32-bit operations. Required minor changes compared to the 32-bit version

It should be possible to make the above types more generic in the future (for example, making Word<T> generic over the word width), but this would make the PR modify much more of the codebase than it does, just for minor type changes around these operations. Making new operations based on the existing ones is the simpler option that makes it clear where and how these operations are used.

These versions are essentially just copies of their 32-bit counterparts,
made to work with a Word64 type. It's not as nice as a fully generic
version
Also add Xor64 operation, fix typo in Add64, add simple test
adr1anh
adr1anh previously approved these changes Sep 30, 2024

@adr1anhadr1anh left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

There are a few things that could be optimized, but that can be done at a later time. Nice work!

Comment threadcore/src/air/word_64.rs Outdated
local.is_real,
);
let reduced_prev_i = local.i_mem.prev_value().reduce::<AB>();
builder

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We should be able to trust i since it's coming from the Rust code that calls compress

);

// Calculate temp1 := h + S1 + ch + k[i] + w[i].
Add64Operation::<AB::F>::eval(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Just making a note, but the Add operation does not need to range check the inputs since we can assume they are bytes (either as an XOR result or because they come from the ZKVM)

);

// Calculate temp1 := h + S1 + ch + k[i] + w[i].
Add64Operation::<AB::F>::eval(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We could also use an Add4 gadget

Not very useful considering it will almost always overflow. Can be added
back if necessary.
@wwaredwwared mentioned this pull request Sep 30, 2024
@wwared
wwared marked this pull request as ready for review September 30, 2024 13:42

@storojs72storojs72 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@wwared
wwared merged commit 75d6e85 into devSep 30, 2024
@wwared
wwared deleted the sha512_gadgets branch September 30, 2024 16:20
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.

3 participants

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

feat: Add sha512 precompiles - #179

Merged
wwared merged 10 commits into
devfrom
sha512_gadgets
Sep 30, 2024
Merged

feat: Add sha512 precompiles#179
wwared merged 10 commits into
devfrom
sha512_gadgets

Conversation

@wwared

@wwaredwwared commented Sep 27, 2024

Copy link
Copy Markdown
Contributor

Companion PR: argumentcomputer/RustCrypto-hashes#1 and argumentcomputer/zk-light-clients#256

This PR adds two new syscalls, for SHA-512 extend and compress operations.

Due to the large amount of byte lookups performed per instruction, these instructions all perform a single iteration of the main loop of its corresponding iteration. This means the library code must call these in a loop to perform the entire operation (see the companion PR for how that is done).

Additionally, this PR adds the following types and operations geared towards 64-bit words:

  • Word64<T>, the 64-bit variant of Word<T>
  • Add64Operation, Xor64Operation, And64Operation, Not64Operation: trivial 64-bit variants of their 32-bit counterparts
  • FixedRotateRight64Operation and FixedShiftRight64Operation: the 64-bit counterpart to the 32-bit operations. Required minor changes compared to the 32-bit version

It should be possible to make the above types more generic in the future (for example, making Word<T> generic over the word width), but this would make the PR modify much more of the codebase than it does, just for minor type changes around these operations. Making new operations based on the existing ones is the simpler option that makes it clear where and how these operations are used.

These versions are essentially just copies of their 32-bit counterparts,
made to work with a Word64 type. It's not as nice as a fully generic
version
Also add Xor64 operation, fix typo in Add64, add simple test
adr1anh
adr1anh previously approved these changes Sep 30, 2024

@adr1anhadr1anh left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

There are a few things that could be optimized, but that can be done at a later time. Nice work!

Comment threadcore/src/air/word_64.rs Outdated
local.is_real,
);
let reduced_prev_i = local.i_mem.prev_value().reduce::<AB>();
builder

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We should be able to trust i since it's coming from the Rust code that calls compress

);

// Calculate temp1 := h + S1 + ch + k[i] + w[i].
Add64Operation::<AB::F>::eval(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Just making a note, but the Add operation does not need to range check the inputs since we can assume they are bytes (either as an XOR result or because they come from the ZKVM)

);

// Calculate temp1 := h + S1 + ch + k[i] + w[i].
Add64Operation::<AB::F>::eval(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We could also use an Add4 gadget

Not very useful considering it will almost always overflow. Can be added
back if necessary.
@wwaredwwared mentioned this pull request Sep 30, 2024
@wwared
wwared marked this pull request as ready for review September 30, 2024 13:42

@storojs72storojs72 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@wwared
wwared merged commit 75d6e85 into devSep 30, 2024
@wwared
wwared deleted the sha512_gadgets branch September 30, 2024 16:20
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.

3 participants

@wwared@adr1anh@storojs72
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: Add sha512 precompiles - #179

Merged
wwared merged 10 commits into
devfrom
sha512_gadgets
Sep 30, 2024
Merged

feat: Add sha512 precompiles#179
wwared merged 10 commits into
devfrom
sha512_gadgets

Conversation

@wwared

@wwaredwwared commented Sep 27, 2024

Copy link
Copy Markdown
Contributor

Companion PR: argumentcomputer/RustCrypto-hashes#1 and argumentcomputer/zk-light-clients#256

This PR adds two new syscalls, for SHA-512 extend and compress operations.

Due to the large amount of byte lookups performed per instruction, these instructions all perform a single iteration of the main loop of its corresponding iteration. This means the library code must call these in a loop to perform the entire operation (see the companion PR for how that is done).

Additionally, this PR adds the following types and operations geared towards 64-bit words:

  • Word64<T>, the 64-bit variant of Word<T>
  • Add64Operation, Xor64Operation, And64Operation, Not64Operation: trivial 64-bit variants of their 32-bit counterparts
  • FixedRotateRight64Operation and FixedShiftRight64Operation: the 64-bit counterpart to the 32-bit operations. Required minor changes compared to the 32-bit version

It should be possible to make the above types more generic in the future (for example, making Word<T> generic over the word width), but this would make the PR modify much more of the codebase than it does, just for minor type changes around these operations. Making new operations based on the existing ones is the simpler option that makes it clear where and how these operations are used.

These versions are essentially just copies of their 32-bit counterparts,
made to work with a Word64 type. It's not as nice as a fully generic
version
Also add Xor64 operation, fix typo in Add64, add simple test
adr1anh
adr1anh previously approved these changes Sep 30, 2024

@adr1anhadr1anh left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

There are a few things that could be optimized, but that can be done at a later time. Nice work!

Comment threadcore/src/air/word_64.rs Outdated
local.is_real,
);
let reduced_prev_i = local.i_mem.prev_value().reduce::<AB>();
builder

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We should be able to trust i since it's coming from the Rust code that calls compress

);

// Calculate temp1 := h + S1 + ch + k[i] + w[i].
Add64Operation::<AB::F>::eval(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Just making a note, but the Add operation does not need to range check the inputs since we can assume they are bytes (either as an XOR result or because they come from the ZKVM)

);

// Calculate temp1 := h + S1 + ch + k[i] + w[i].
Add64Operation::<AB::F>::eval(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We could also use an Add4 gadget

Not very useful considering it will almost always overflow. Can be added
back if necessary.
@wwaredwwared mentioned this pull request Sep 30, 2024
@wwared
wwared marked this pull request as ready for review September 30, 2024 13:42

@storojs72storojs72 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@wwared
wwared merged commit 75d6e85 into devSep 30, 2024
@wwared
wwared deleted the sha512_gadgets branch September 30, 2024 16:20
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.

3 participants

@wwared@adr1anh@storojs72
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: Add sha512 precompiles - #179

Merged
wwared merged 10 commits into
devfrom
sha512_gadgets
Sep 30, 2024
Merged

feat: Add sha512 precompiles#179
wwared merged 10 commits into
devfrom
sha512_gadgets

Conversation

@wwared

@wwaredwwared commented Sep 27, 2024

Copy link
Copy Markdown
Contributor

Companion PR: argumentcomputer/RustCrypto-hashes#1 and argumentcomputer/zk-light-clients#256

This PR adds two new syscalls, for SHA-512 extend and compress operations.

Due to the large amount of byte lookups performed per instruction, these instructions all perform a single iteration of the main loop of its corresponding iteration. This means the library code must call these in a loop to perform the entire operation (see the companion PR for how that is done).

Additionally, this PR adds the following types and operations geared towards 64-bit words:

  • Word64<T>, the 64-bit variant of Word<T>
  • Add64Operation, Xor64Operation, And64Operation, Not64Operation: trivial 64-bit variants of their 32-bit counterparts
  • FixedRotateRight64Operation and FixedShiftRight64Operation: the 64-bit counterpart to the 32-bit operations. Required minor changes compared to the 32-bit version

It should be possible to make the above types more generic in the future (for example, making Word<T> generic over the word width), but this would make the PR modify much more of the codebase than it does, just for minor type changes around these operations. Making new operations based on the existing ones is the simpler option that makes it clear where and how these operations are used.

These versions are essentially just copies of their 32-bit counterparts,
made to work with a Word64 type. It's not as nice as a fully generic
version
Also add Xor64 operation, fix typo in Add64, add simple test
adr1anh
adr1anh previously approved these changes Sep 30, 2024

@adr1anhadr1anh left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

There are a few things that could be optimized, but that can be done at a later time. Nice work!

Comment threadcore/src/air/word_64.rs Outdated
local.is_real,
);
let reduced_prev_i = local.i_mem.prev_value().reduce::<AB>();
builder

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We should be able to trust i since it's coming from the Rust code that calls compress

);

// Calculate temp1 := h + S1 + ch + k[i] + w[i].
Add64Operation::<AB::F>::eval(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Just making a note, but the Add operation does not need to range check the inputs since we can assume they are bytes (either as an XOR result or because they come from the ZKVM)

);

// Calculate temp1 := h + S1 + ch + k[i] + w[i].
Add64Operation::<AB::F>::eval(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We could also use an Add4 gadget

Not very useful considering it will almost always overflow. Can be added
back if necessary.
@wwaredwwared mentioned this pull request Sep 30, 2024
@wwared
wwared marked this pull request as ready for review September 30, 2024 13:42

@storojs72storojs72 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@wwared
wwared merged commit 75d6e85 into devSep 30, 2024
@wwared
wwared deleted the sha512_gadgets branch September 30, 2024 16:20
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.

3 participants

@wwared@adr1anh@storojs72
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: Add sha512 precompiles - #179

Merged
wwared merged 10 commits into
devfrom
sha512_gadgets
Sep 30, 2024
Merged

feat: Add sha512 precompiles#179
wwared merged 10 commits into
devfrom
sha512_gadgets

Conversation

@wwared

@wwaredwwared commented Sep 27, 2024

Copy link
Copy Markdown
Contributor

Companion PR: argumentcomputer/RustCrypto-hashes#1 and argumentcomputer/zk-light-clients#256

This PR adds two new syscalls, for SHA-512 extend and compress operations.

Due to the large amount of byte lookups performed per instruction, these instructions all perform a single iteration of the main loop of its corresponding iteration. This means the library code must call these in a loop to perform the entire operation (see the companion PR for how that is done).

Additionally, this PR adds the following types and operations geared towards 64-bit words:

  • Word64<T>, the 64-bit variant of Word<T>
  • Add64Operation, Xor64Operation, And64Operation, Not64Operation: trivial 64-bit variants of their 32-bit counterparts
  • FixedRotateRight64Operation and FixedShiftRight64Operation: the 64-bit counterpart to the 32-bit operations. Required minor changes compared to the 32-bit version

It should be possible to make the above types more generic in the future (for example, making Word<T> generic over the word width), but this would make the PR modify much more of the codebase than it does, just for minor type changes around these operations. Making new operations based on the existing ones is the simpler option that makes it clear where and how these operations are used.

These versions are essentially just copies of their 32-bit counterparts,
made to work with a Word64 type. It's not as nice as a fully generic
version
Also add Xor64 operation, fix typo in Add64, add simple test
adr1anh
adr1anh previously approved these changes Sep 30, 2024

@adr1anhadr1anh left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

There are a few things that could be optimized, but that can be done at a later time. Nice work!

Comment threadcore/src/air/word_64.rs Outdated
local.is_real,
);
let reduced_prev_i = local.i_mem.prev_value().reduce::<AB>();
builder

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We should be able to trust i since it's coming from the Rust code that calls compress

);

// Calculate temp1 := h + S1 + ch + k[i] + w[i].
Add64Operation::<AB::F>::eval(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Just making a note, but the Add operation does not need to range check the inputs since we can assume they are bytes (either as an XOR result or because they come from the ZKVM)

);

// Calculate temp1 := h + S1 + ch + k[i] + w[i].
Add64Operation::<AB::F>::eval(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We could also use an Add4 gadget

Not very useful considering it will almost always overflow. Can be added
back if necessary.
@wwaredwwared mentioned this pull request Sep 30, 2024
@wwared
wwared marked this pull request as ready for review September 30, 2024 13:42

@storojs72storojs72 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@wwared
wwared merged commit 75d6e85 into devSep 30, 2024
@wwared
wwared deleted the sha512_gadgets branch September 30, 2024 16:20
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.

3 participants

@wwared@adr1anh@storojs72