der: support for the REAL type - #346

Merged
tarcieri merged 27 commits into
RustCrypto:masterfrom
ChristopherRabotin:304-der-support-real-type
Mar 27, 2022
Merged

der: support for the REAL type#346
tarcieri merged 27 commits into
RustCrypto:masterfrom
ChristopherRabotin:304-der-support-real-type

Conversation

@ChristopherRabotin

@ChristopherRabotinChristopherRabotin commented Jan 19, 2022

Copy link
Copy Markdown
Contributor

Covers sections 8.5 and 11.3 of ITU-T X.690 (02/2021)

Caveats:
1. Interpretation of section 11.3.1 to be further discussed
2. Currently, all encoding is binary (no ISO 6093 NR3)

Testing of arbitrarily large and small f64s shows that DER typically
requires 12 bytes to encode these 8-byte IEEE-754 values. This can be
explained because of the extra two bytes for the tag and length, and the
fact that the exponent is encoded on 1 to 2 bytes (only 11 bits in
IEEE-754), and the mantissa may require up to 8 bytes itself, hence 12
bytes total. Of note that, depending on Caveat 1 above, this information
may be wrong.

Closes#304

Source: https://www.oss.com/asn1/resources/books-whitepapers-pubs/larmouth-asn1-book.pdf, page 174
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Covers sections 8.5 and 11.3 of ITU-T X.690 (02/2021)
Caveats:
1. Interpretation of section 11.3.1 to be further discussed
2. Currently, all encoding is binary (no ISO 6093 NR3)
Testing of arbitrarily large and small f64s shows that DER typically
requires 12 bytes to encode these 8-byte IEEE-754 values. This can be
explained because of the extra two bytes for the tag and length, and the
fact that the exponent is encoded on 1 to 2 bytes (only 11 bits in
IEEE-754), and the mantissa may require up to 8 bytes itself, hence 12
bytes total. Of note that, depending on Caveat 1 above, this information
may be wrong.
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Comment threadder/src/asn1/real.rs Outdated
Comment threadder/src/asn1/real.rs Outdated
@tarcieri

Copy link
Copy Markdown
Member

If you can find another implementation to do interop testing with, that'd be great

ChristopherRabotinand others added 2 commits January 30, 2022 22:13
Co-authored-by: Tony Arcieri <bascule@gmail.com>
Co-authored-by: Tony Arcieri <bascule@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review. I'll add a demo encoding from the ASN1 playground

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Comment threadder/src/error.rs Outdated
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

As a quick update, I'm working on adding a bunch of validation test cases. It's gonna take some time as it seems like some of my encoding does not match the ASN1 playground so I'm going through the specs again to better understand what I didn't implement correctly. I'll keep the branch up-to-date with master.

ChristopherRabotinand others added 6 commits February 6, 2022 20:53
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
These were commented because the ASN1 playground encodes in NR3
(base 10) but this impl only encodes in base 2, so the reciprocity tests
would never have worked. Instead, all other cases were tested for
decoding in the ASN1 playground.
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

After a two months of working on other stuff, here's the updated PR with validation cases. Let me know if you have any questions.

I'm not sure why clippy is failing in the Github actions, it works locally with clippy 0.1.59 (9d1b210 2022-02-23).

Cheers

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Not sure what this CI build failed as running cargo test --no-default-features works locally and both the val and val2 variables are in fact defined.

@tarcieri

Copy link
Copy Markdown
Member

It's failing here:

https://github.com/RustCrypto/formats/runs/5669154521?check_suite_focus=true

error: there is no argument named `val`
--> der/src/asn1/real.rs:827:30
|
827 | "fail - want {val}\tgot {val2}"
| ^^^^^
error: there is no argument named `val2`
--> der/src/asn1/real.rs:827:[41](https://github.com/RustCrypto/formats/runs/5669154521?check_suite_focus=true#step:7:41)
|
827 | "fail - want {val}\tgot {val2}"
|

I think the issue is that this is using the new captured identifiers in format strings feature which was introduced in Rust 1.58, and the MSRV of the crate is 1.57, which is what the test is failing on.

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Fixed, thanks!

Comment threadder/src/asn1/real.rs Outdated
Co-authored-by: Tony Arcieri <bascule@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Thanks for the suggestion, that fixed all of the tests.

Comment threadder/src/asn1/real.rs Outdated
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@tarcieri
tarcieri merged commit f13d734 into RustCrypto:masterMar 27, 2022
@tarcieri

Copy link
Copy Markdown
Member

Thank you!

@tarcieritarcieri mentioned this pull request May 8, 2022
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.

der: support for the REAL type

2 participants

@ChristopherRabotin@tarcieri
, '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

der: support for the REAL type - #346

Merged
tarcieri merged 27 commits into
RustCrypto:masterfrom
ChristopherRabotin:304-der-support-real-type
Mar 27, 2022
Merged

der: support for the REAL type#346
tarcieri merged 27 commits into
RustCrypto:masterfrom
ChristopherRabotin:304-der-support-real-type

Conversation

@ChristopherRabotin

@ChristopherRabotinChristopherRabotin commented Jan 19, 2022

Copy link
Copy Markdown
Contributor

Covers sections 8.5 and 11.3 of ITU-T X.690 (02/2021)

Caveats:
1. Interpretation of section 11.3.1 to be further discussed
2. Currently, all encoding is binary (no ISO 6093 NR3)

Testing of arbitrarily large and small f64s shows that DER typically
requires 12 bytes to encode these 8-byte IEEE-754 values. This can be
explained because of the extra two bytes for the tag and length, and the
fact that the exponent is encoded on 1 to 2 bytes (only 11 bits in
IEEE-754), and the mantissa may require up to 8 bytes itself, hence 12
bytes total. Of note that, depending on Caveat 1 above, this information
may be wrong.

Closes#304

Source: https://www.oss.com/asn1/resources/books-whitepapers-pubs/larmouth-asn1-book.pdf, page 174
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Covers sections 8.5 and 11.3 of ITU-T X.690 (02/2021)
Caveats:
1. Interpretation of section 11.3.1 to be further discussed
2. Currently, all encoding is binary (no ISO 6093 NR3)
Testing of arbitrarily large and small f64s shows that DER typically
requires 12 bytes to encode these 8-byte IEEE-754 values. This can be
explained because of the extra two bytes for the tag and length, and the
fact that the exponent is encoded on 1 to 2 bytes (only 11 bits in
IEEE-754), and the mantissa may require up to 8 bytes itself, hence 12
bytes total. Of note that, depending on Caveat 1 above, this information
may be wrong.
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Comment threadder/src/asn1/real.rs Outdated
Comment threadder/src/asn1/real.rs Outdated
@tarcieri

Copy link
Copy Markdown
Member

If you can find another implementation to do interop testing with, that'd be great

ChristopherRabotinand others added 2 commits January 30, 2022 22:13
Co-authored-by: Tony Arcieri <bascule@gmail.com>
Co-authored-by: Tony Arcieri <bascule@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review. I'll add a demo encoding from the ASN1 playground

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Comment threadder/src/error.rs Outdated
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

As a quick update, I'm working on adding a bunch of validation test cases. It's gonna take some time as it seems like some of my encoding does not match the ASN1 playground so I'm going through the specs again to better understand what I didn't implement correctly. I'll keep the branch up-to-date with master.

ChristopherRabotinand others added 6 commits February 6, 2022 20:53
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
These were commented because the ASN1 playground encodes in NR3
(base 10) but this impl only encodes in base 2, so the reciprocity tests
would never have worked. Instead, all other cases were tested for
decoding in the ASN1 playground.
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

After a two months of working on other stuff, here's the updated PR with validation cases. Let me know if you have any questions.

I'm not sure why clippy is failing in the Github actions, it works locally with clippy 0.1.59 (9d1b210 2022-02-23).

Cheers

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Not sure what this CI build failed as running cargo test --no-default-features works locally and both the val and val2 variables are in fact defined.

@tarcieri

Copy link
Copy Markdown
Member

It's failing here:

https://github.com/RustCrypto/formats/runs/5669154521?check_suite_focus=true

error: there is no argument named `val`
--> der/src/asn1/real.rs:827:30
|
827 | "fail - want {val}\tgot {val2}"
| ^^^^^
error: there is no argument named `val2`
--> der/src/asn1/real.rs:827:[41](https://github.com/RustCrypto/formats/runs/5669154521?check_suite_focus=true#step:7:41)
|
827 | "fail - want {val}\tgot {val2}"
|

I think the issue is that this is using the new captured identifiers in format strings feature which was introduced in Rust 1.58, and the MSRV of the crate is 1.57, which is what the test is failing on.

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Fixed, thanks!

Comment threadder/src/asn1/real.rs Outdated
Co-authored-by: Tony Arcieri <bascule@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Thanks for the suggestion, that fixed all of the tests.

Comment threadder/src/asn1/real.rs Outdated
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@tarcieri
tarcieri merged commit f13d734 into RustCrypto:masterMar 27, 2022
@tarcieri

Copy link
Copy Markdown
Member

Thank you!

@tarcieritarcieri mentioned this pull request May 8, 2022
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.

der: support for the REAL type

2 participants

@ChristopherRabotin@tarcieri
, '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

der: support for the REAL type - #346

Merged
tarcieri merged 27 commits into
RustCrypto:masterfrom
ChristopherRabotin:304-der-support-real-type
Mar 27, 2022
Merged

der: support for the REAL type#346
tarcieri merged 27 commits into
RustCrypto:masterfrom
ChristopherRabotin:304-der-support-real-type

Conversation

@ChristopherRabotin

@ChristopherRabotinChristopherRabotin commented Jan 19, 2022

Copy link
Copy Markdown
Contributor

Covers sections 8.5 and 11.3 of ITU-T X.690 (02/2021)

Caveats:
1. Interpretation of section 11.3.1 to be further discussed
2. Currently, all encoding is binary (no ISO 6093 NR3)

Testing of arbitrarily large and small f64s shows that DER typically
requires 12 bytes to encode these 8-byte IEEE-754 values. This can be
explained because of the extra two bytes for the tag and length, and the
fact that the exponent is encoded on 1 to 2 bytes (only 11 bits in
IEEE-754), and the mantissa may require up to 8 bytes itself, hence 12
bytes total. Of note that, depending on Caveat 1 above, this information
may be wrong.

Closes#304

Source: https://www.oss.com/asn1/resources/books-whitepapers-pubs/larmouth-asn1-book.pdf, page 174
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Covers sections 8.5 and 11.3 of ITU-T X.690 (02/2021)
Caveats:
1. Interpretation of section 11.3.1 to be further discussed
2. Currently, all encoding is binary (no ISO 6093 NR3)
Testing of arbitrarily large and small f64s shows that DER typically
requires 12 bytes to encode these 8-byte IEEE-754 values. This can be
explained because of the extra two bytes for the tag and length, and the
fact that the exponent is encoded on 1 to 2 bytes (only 11 bits in
IEEE-754), and the mantissa may require up to 8 bytes itself, hence 12
bytes total. Of note that, depending on Caveat 1 above, this information
may be wrong.
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Comment threadder/src/asn1/real.rs Outdated
Comment threadder/src/asn1/real.rs Outdated
@tarcieri

Copy link
Copy Markdown
Member

If you can find another implementation to do interop testing with, that'd be great

ChristopherRabotinand others added 2 commits January 30, 2022 22:13
Co-authored-by: Tony Arcieri <bascule@gmail.com>
Co-authored-by: Tony Arcieri <bascule@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review. I'll add a demo encoding from the ASN1 playground

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Comment threadder/src/error.rs Outdated
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

As a quick update, I'm working on adding a bunch of validation test cases. It's gonna take some time as it seems like some of my encoding does not match the ASN1 playground so I'm going through the specs again to better understand what I didn't implement correctly. I'll keep the branch up-to-date with master.

ChristopherRabotinand others added 6 commits February 6, 2022 20:53
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
These were commented because the ASN1 playground encodes in NR3
(base 10) but this impl only encodes in base 2, so the reciprocity tests
would never have worked. Instead, all other cases were tested for
decoding in the ASN1 playground.
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

After a two months of working on other stuff, here's the updated PR with validation cases. Let me know if you have any questions.

I'm not sure why clippy is failing in the Github actions, it works locally with clippy 0.1.59 (9d1b210 2022-02-23).

Cheers

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Not sure what this CI build failed as running cargo test --no-default-features works locally and both the val and val2 variables are in fact defined.

@tarcieri

Copy link
Copy Markdown
Member

It's failing here:

https://github.com/RustCrypto/formats/runs/5669154521?check_suite_focus=true

error: there is no argument named `val`
--> der/src/asn1/real.rs:827:30
|
827 | "fail - want {val}\tgot {val2}"
| ^^^^^
error: there is no argument named `val2`
--> der/src/asn1/real.rs:827:[41](https://github.com/RustCrypto/formats/runs/5669154521?check_suite_focus=true#step:7:41)
|
827 | "fail - want {val}\tgot {val2}"
|

I think the issue is that this is using the new captured identifiers in format strings feature which was introduced in Rust 1.58, and the MSRV of the crate is 1.57, which is what the test is failing on.

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Fixed, thanks!

Comment threadder/src/asn1/real.rs Outdated
Co-authored-by: Tony Arcieri <bascule@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Thanks for the suggestion, that fixed all of the tests.

Comment threadder/src/asn1/real.rs Outdated
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@tarcieri
tarcieri merged commit f13d734 into RustCrypto:masterMar 27, 2022
@tarcieri

Copy link
Copy Markdown
Member

Thank you!

@tarcieritarcieri mentioned this pull request May 8, 2022
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.

der: support for the REAL type

2 participants

@ChristopherRabotin@tarcieri
, '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

der: support for the REAL type - #346

Merged
tarcieri merged 27 commits into
RustCrypto:masterfrom
ChristopherRabotin:304-der-support-real-type
Mar 27, 2022
Merged

der: support for the REAL type#346
tarcieri merged 27 commits into
RustCrypto:masterfrom
ChristopherRabotin:304-der-support-real-type

Conversation

@ChristopherRabotin

@ChristopherRabotinChristopherRabotin commented Jan 19, 2022

Copy link
Copy Markdown
Contributor

Covers sections 8.5 and 11.3 of ITU-T X.690 (02/2021)

Caveats:
1. Interpretation of section 11.3.1 to be further discussed
2. Currently, all encoding is binary (no ISO 6093 NR3)

Testing of arbitrarily large and small f64s shows that DER typically
requires 12 bytes to encode these 8-byte IEEE-754 values. This can be
explained because of the extra two bytes for the tag and length, and the
fact that the exponent is encoded on 1 to 2 bytes (only 11 bits in
IEEE-754), and the mantissa may require up to 8 bytes itself, hence 12
bytes total. Of note that, depending on Caveat 1 above, this information
may be wrong.

Closes#304

Source: https://www.oss.com/asn1/resources/books-whitepapers-pubs/larmouth-asn1-book.pdf, page 174
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Covers sections 8.5 and 11.3 of ITU-T X.690 (02/2021)
Caveats:
1. Interpretation of section 11.3.1 to be further discussed
2. Currently, all encoding is binary (no ISO 6093 NR3)
Testing of arbitrarily large and small f64s shows that DER typically
requires 12 bytes to encode these 8-byte IEEE-754 values. This can be
explained because of the extra two bytes for the tag and length, and the
fact that the exponent is encoded on 1 to 2 bytes (only 11 bits in
IEEE-754), and the mantissa may require up to 8 bytes itself, hence 12
bytes total. Of note that, depending on Caveat 1 above, this information
may be wrong.
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Comment threadder/src/asn1/real.rs Outdated
Comment threadder/src/asn1/real.rs Outdated
@tarcieri

Copy link
Copy Markdown
Member

If you can find another implementation to do interop testing with, that'd be great

ChristopherRabotinand others added 2 commits January 30, 2022 22:13
Co-authored-by: Tony Arcieri <bascule@gmail.com>
Co-authored-by: Tony Arcieri <bascule@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review. I'll add a demo encoding from the ASN1 playground

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Comment threadder/src/error.rs Outdated
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

As a quick update, I'm working on adding a bunch of validation test cases. It's gonna take some time as it seems like some of my encoding does not match the ASN1 playground so I'm going through the specs again to better understand what I didn't implement correctly. I'll keep the branch up-to-date with master.

ChristopherRabotinand others added 6 commits February 6, 2022 20:53
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
These were commented because the ASN1 playground encodes in NR3
(base 10) but this impl only encodes in base 2, so the reciprocity tests
would never have worked. Instead, all other cases were tested for
decoding in the ASN1 playground.
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

After a two months of working on other stuff, here's the updated PR with validation cases. Let me know if you have any questions.

I'm not sure why clippy is failing in the Github actions, it works locally with clippy 0.1.59 (9d1b210 2022-02-23).

Cheers

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Not sure what this CI build failed as running cargo test --no-default-features works locally and both the val and val2 variables are in fact defined.

@tarcieri

Copy link
Copy Markdown
Member

It's failing here:

https://github.com/RustCrypto/formats/runs/5669154521?check_suite_focus=true

error: there is no argument named `val`
--> der/src/asn1/real.rs:827:30
|
827 | "fail - want {val}\tgot {val2}"
| ^^^^^
error: there is no argument named `val2`
--> der/src/asn1/real.rs:827:[41](https://github.com/RustCrypto/formats/runs/5669154521?check_suite_focus=true#step:7:41)
|
827 | "fail - want {val}\tgot {val2}"
|

I think the issue is that this is using the new captured identifiers in format strings feature which was introduced in Rust 1.58, and the MSRV of the crate is 1.57, which is what the test is failing on.

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Fixed, thanks!

Comment threadder/src/asn1/real.rs Outdated
Co-authored-by: Tony Arcieri <bascule@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Thanks for the suggestion, that fixed all of the tests.

Comment threadder/src/asn1/real.rs Outdated
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@tarcieri
tarcieri merged commit f13d734 into RustCrypto:masterMar 27, 2022
@tarcieri

Copy link
Copy Markdown
Member

Thank you!

@tarcieritarcieri mentioned this pull request May 8, 2022
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.

der: support for the REAL type

2 participants

@ChristopherRabotin@tarcieri
, '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

der: support for the REAL type - #346

Merged
tarcieri merged 27 commits into
RustCrypto:masterfrom
ChristopherRabotin:304-der-support-real-type
Mar 27, 2022
Merged

der: support for the REAL type#346
tarcieri merged 27 commits into
RustCrypto:masterfrom
ChristopherRabotin:304-der-support-real-type

Conversation

@ChristopherRabotin

@ChristopherRabotinChristopherRabotin commented Jan 19, 2022

Copy link
Copy Markdown
Contributor

Covers sections 8.5 and 11.3 of ITU-T X.690 (02/2021)

Caveats:
1. Interpretation of section 11.3.1 to be further discussed
2. Currently, all encoding is binary (no ISO 6093 NR3)

Testing of arbitrarily large and small f64s shows that DER typically
requires 12 bytes to encode these 8-byte IEEE-754 values. This can be
explained because of the extra two bytes for the tag and length, and the
fact that the exponent is encoded on 1 to 2 bytes (only 11 bits in
IEEE-754), and the mantissa may require up to 8 bytes itself, hence 12
bytes total. Of note that, depending on Caveat 1 above, this information
may be wrong.

Closes#304

Source: https://www.oss.com/asn1/resources/books-whitepapers-pubs/larmouth-asn1-book.pdf, page 174
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Covers sections 8.5 and 11.3 of ITU-T X.690 (02/2021)
Caveats:
1. Interpretation of section 11.3.1 to be further discussed
2. Currently, all encoding is binary (no ISO 6093 NR3)
Testing of arbitrarily large and small f64s shows that DER typically
requires 12 bytes to encode these 8-byte IEEE-754 values. This can be
explained because of the extra two bytes for the tag and length, and the
fact that the exponent is encoded on 1 to 2 bytes (only 11 bits in
IEEE-754), and the mantissa may require up to 8 bytes itself, hence 12
bytes total. Of note that, depending on Caveat 1 above, this information
may be wrong.
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Comment threadder/src/asn1/real.rs Outdated
Comment threadder/src/asn1/real.rs Outdated
@tarcieri

Copy link
Copy Markdown
Member

If you can find another implementation to do interop testing with, that'd be great

ChristopherRabotinand others added 2 commits January 30, 2022 22:13
Co-authored-by: Tony Arcieri <bascule@gmail.com>
Co-authored-by: Tony Arcieri <bascule@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review. I'll add a demo encoding from the ASN1 playground

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Comment threadder/src/error.rs Outdated
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

As a quick update, I'm working on adding a bunch of validation test cases. It's gonna take some time as it seems like some of my encoding does not match the ASN1 playground so I'm going through the specs again to better understand what I didn't implement correctly. I'll keep the branch up-to-date with master.

ChristopherRabotinand others added 6 commits February 6, 2022 20:53
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
These were commented because the ASN1 playground encodes in NR3
(base 10) but this impl only encodes in base 2, so the reciprocity tests
would never have worked. Instead, all other cases were tested for
decoding in the ASN1 playground.
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

After a two months of working on other stuff, here's the updated PR with validation cases. Let me know if you have any questions.

I'm not sure why clippy is failing in the Github actions, it works locally with clippy 0.1.59 (9d1b210 2022-02-23).

Cheers

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Not sure what this CI build failed as running cargo test --no-default-features works locally and both the val and val2 variables are in fact defined.

@tarcieri

Copy link
Copy Markdown
Member

It's failing here:

https://github.com/RustCrypto/formats/runs/5669154521?check_suite_focus=true

error: there is no argument named `val`
--> der/src/asn1/real.rs:827:30
|
827 | "fail - want {val}\tgot {val2}"
| ^^^^^
error: there is no argument named `val2`
--> der/src/asn1/real.rs:827:[41](https://github.com/RustCrypto/formats/runs/5669154521?check_suite_focus=true#step:7:41)
|
827 | "fail - want {val}\tgot {val2}"
|

I think the issue is that this is using the new captured identifiers in format strings feature which was introduced in Rust 1.58, and the MSRV of the crate is 1.57, which is what the test is failing on.

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Fixed, thanks!

Comment threadder/src/asn1/real.rs Outdated
Co-authored-by: Tony Arcieri <bascule@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Thanks for the suggestion, that fixed all of the tests.

Comment threadder/src/asn1/real.rs Outdated
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@tarcieri
tarcieri merged commit f13d734 into RustCrypto:masterMar 27, 2022
@tarcieri

Copy link
Copy Markdown
Member

Thank you!

@tarcieritarcieri mentioned this pull request May 8, 2022
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.

der: support for the REAL type

2 participants

@ChristopherRabotin@tarcieri
, '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

der: support for the REAL type - #346

Merged
tarcieri merged 27 commits into
RustCrypto:masterfrom
ChristopherRabotin:304-der-support-real-type
Mar 27, 2022
Merged

der: support for the REAL type#346
tarcieri merged 27 commits into
RustCrypto:masterfrom
ChristopherRabotin:304-der-support-real-type

Conversation

@ChristopherRabotin

@ChristopherRabotinChristopherRabotin commented Jan 19, 2022

Copy link
Copy Markdown
Contributor

Covers sections 8.5 and 11.3 of ITU-T X.690 (02/2021)

Caveats:
1. Interpretation of section 11.3.1 to be further discussed
2. Currently, all encoding is binary (no ISO 6093 NR3)

Testing of arbitrarily large and small f64s shows that DER typically
requires 12 bytes to encode these 8-byte IEEE-754 values. This can be
explained because of the extra two bytes for the tag and length, and the
fact that the exponent is encoded on 1 to 2 bytes (only 11 bits in
IEEE-754), and the mantissa may require up to 8 bytes itself, hence 12
bytes total. Of note that, depending on Caveat 1 above, this information
may be wrong.

Closes#304

Source: https://www.oss.com/asn1/resources/books-whitepapers-pubs/larmouth-asn1-book.pdf, page 174
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Covers sections 8.5 and 11.3 of ITU-T X.690 (02/2021)
Caveats:
1. Interpretation of section 11.3.1 to be further discussed
2. Currently, all encoding is binary (no ISO 6093 NR3)
Testing of arbitrarily large and small f64s shows that DER typically
requires 12 bytes to encode these 8-byte IEEE-754 values. This can be
explained because of the extra two bytes for the tag and length, and the
fact that the exponent is encoded on 1 to 2 bytes (only 11 bits in
IEEE-754), and the mantissa may require up to 8 bytes itself, hence 12
bytes total. Of note that, depending on Caveat 1 above, this information
may be wrong.
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Comment threadder/src/asn1/real.rs Outdated
Comment threadder/src/asn1/real.rs Outdated
@tarcieri

Copy link
Copy Markdown
Member

If you can find another implementation to do interop testing with, that'd be great

ChristopherRabotinand others added 2 commits January 30, 2022 22:13
Co-authored-by: Tony Arcieri <bascule@gmail.com>
Co-authored-by: Tony Arcieri <bascule@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review. I'll add a demo encoding from the ASN1 playground

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Comment threadder/src/error.rs Outdated
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

As a quick update, I'm working on adding a bunch of validation test cases. It's gonna take some time as it seems like some of my encoding does not match the ASN1 playground so I'm going through the specs again to better understand what I didn't implement correctly. I'll keep the branch up-to-date with master.

ChristopherRabotinand others added 6 commits February 6, 2022 20:53
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
These were commented because the ASN1 playground encodes in NR3
(base 10) but this impl only encodes in base 2, so the reciprocity tests
would never have worked. Instead, all other cases were tested for
decoding in the ASN1 playground.
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

After a two months of working on other stuff, here's the updated PR with validation cases. Let me know if you have any questions.

I'm not sure why clippy is failing in the Github actions, it works locally with clippy 0.1.59 (9d1b210 2022-02-23).

Cheers

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Not sure what this CI build failed as running cargo test --no-default-features works locally and both the val and val2 variables are in fact defined.

@tarcieri

Copy link
Copy Markdown
Member

It's failing here:

https://github.com/RustCrypto/formats/runs/5669154521?check_suite_focus=true

error: there is no argument named `val`
--> der/src/asn1/real.rs:827:30
|
827 | "fail - want {val}\tgot {val2}"
| ^^^^^
error: there is no argument named `val2`
--> der/src/asn1/real.rs:827:[41](https://github.com/RustCrypto/formats/runs/5669154521?check_suite_focus=true#step:7:41)
|
827 | "fail - want {val}\tgot {val2}"
|

I think the issue is that this is using the new captured identifiers in format strings feature which was introduced in Rust 1.58, and the MSRV of the crate is 1.57, which is what the test is failing on.

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Fixed, thanks!

Comment threadder/src/asn1/real.rs Outdated
Co-authored-by: Tony Arcieri <bascule@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Thanks for the suggestion, that fixed all of the tests.

Comment threadder/src/asn1/real.rs Outdated
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@tarcieri
tarcieri merged commit f13d734 into RustCrypto:masterMar 27, 2022
@tarcieri

Copy link
Copy Markdown
Member

Thank you!

@tarcieritarcieri mentioned this pull request May 8, 2022
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.

der: support for the REAL type

2 participants

@ChristopherRabotin@tarcieri
, '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

der: support for the REAL type - #346

Merged
tarcieri merged 27 commits into
RustCrypto:masterfrom
ChristopherRabotin:304-der-support-real-type
Mar 27, 2022
Merged

der: support for the REAL type#346
tarcieri merged 27 commits into
RustCrypto:masterfrom
ChristopherRabotin:304-der-support-real-type

Conversation

@ChristopherRabotin

@ChristopherRabotinChristopherRabotin commented Jan 19, 2022

Copy link
Copy Markdown
Contributor

Covers sections 8.5 and 11.3 of ITU-T X.690 (02/2021)

Caveats:
1. Interpretation of section 11.3.1 to be further discussed
2. Currently, all encoding is binary (no ISO 6093 NR3)

Testing of arbitrarily large and small f64s shows that DER typically
requires 12 bytes to encode these 8-byte IEEE-754 values. This can be
explained because of the extra two bytes for the tag and length, and the
fact that the exponent is encoded on 1 to 2 bytes (only 11 bits in
IEEE-754), and the mantissa may require up to 8 bytes itself, hence 12
bytes total. Of note that, depending on Caveat 1 above, this information
may be wrong.

Closes#304

Source: https://www.oss.com/asn1/resources/books-whitepapers-pubs/larmouth-asn1-book.pdf, page 174
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Covers sections 8.5 and 11.3 of ITU-T X.690 (02/2021)
Caveats:
1. Interpretation of section 11.3.1 to be further discussed
2. Currently, all encoding is binary (no ISO 6093 NR3)
Testing of arbitrarily large and small f64s shows that DER typically
requires 12 bytes to encode these 8-byte IEEE-754 values. This can be
explained because of the extra two bytes for the tag and length, and the
fact that the exponent is encoded on 1 to 2 bytes (only 11 bits in
IEEE-754), and the mantissa may require up to 8 bytes itself, hence 12
bytes total. Of note that, depending on Caveat 1 above, this information
may be wrong.
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Comment threadder/src/asn1/real.rs Outdated
Comment threadder/src/asn1/real.rs Outdated
@tarcieri

Copy link
Copy Markdown
Member

If you can find another implementation to do interop testing with, that'd be great

ChristopherRabotinand others added 2 commits January 30, 2022 22:13
Co-authored-by: Tony Arcieri <bascule@gmail.com>
Co-authored-by: Tony Arcieri <bascule@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review. I'll add a demo encoding from the ASN1 playground

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Comment threadder/src/error.rs Outdated
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

As a quick update, I'm working on adding a bunch of validation test cases. It's gonna take some time as it seems like some of my encoding does not match the ASN1 playground so I'm going through the specs again to better understand what I didn't implement correctly. I'll keep the branch up-to-date with master.

ChristopherRabotinand others added 6 commits February 6, 2022 20:53
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
These were commented because the ASN1 playground encodes in NR3
(base 10) but this impl only encodes in base 2, so the reciprocity tests
would never have worked. Instead, all other cases were tested for
decoding in the ASN1 playground.
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

After a two months of working on other stuff, here's the updated PR with validation cases. Let me know if you have any questions.

I'm not sure why clippy is failing in the Github actions, it works locally with clippy 0.1.59 (9d1b210 2022-02-23).

Cheers

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Not sure what this CI build failed as running cargo test --no-default-features works locally and both the val and val2 variables are in fact defined.

@tarcieri

Copy link
Copy Markdown
Member

It's failing here:

https://github.com/RustCrypto/formats/runs/5669154521?check_suite_focus=true

error: there is no argument named `val`
--> der/src/asn1/real.rs:827:30
|
827 | "fail - want {val}\tgot {val2}"
| ^^^^^
error: there is no argument named `val2`
--> der/src/asn1/real.rs:827:[41](https://github.com/RustCrypto/formats/runs/5669154521?check_suite_focus=true#step:7:41)
|
827 | "fail - want {val}\tgot {val2}"
|

I think the issue is that this is using the new captured identifiers in format strings feature which was introduced in Rust 1.58, and the MSRV of the crate is 1.57, which is what the test is failing on.

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Fixed, thanks!

Comment threadder/src/asn1/real.rs Outdated
Co-authored-by: Tony Arcieri <bascule@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Thanks for the suggestion, that fixed all of the tests.

Comment threadder/src/asn1/real.rs Outdated
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@tarcieri
tarcieri merged commit f13d734 into RustCrypto:masterMar 27, 2022
@tarcieri

Copy link
Copy Markdown
Member

Thank you!

@tarcieritarcieri mentioned this pull request May 8, 2022
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.

der: support for the REAL type

2 participants

@ChristopherRabotin@tarcieri
, '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

der: support for the REAL type - #346

Merged
tarcieri merged 27 commits into
RustCrypto:masterfrom
ChristopherRabotin:304-der-support-real-type
Mar 27, 2022
Merged

der: support for the REAL type#346
tarcieri merged 27 commits into
RustCrypto:masterfrom
ChristopherRabotin:304-der-support-real-type

Conversation

@ChristopherRabotin

@ChristopherRabotinChristopherRabotin commented Jan 19, 2022

Copy link
Copy Markdown
Contributor

Covers sections 8.5 and 11.3 of ITU-T X.690 (02/2021)

Caveats:
1. Interpretation of section 11.3.1 to be further discussed
2. Currently, all encoding is binary (no ISO 6093 NR3)

Testing of arbitrarily large and small f64s shows that DER typically
requires 12 bytes to encode these 8-byte IEEE-754 values. This can be
explained because of the extra two bytes for the tag and length, and the
fact that the exponent is encoded on 1 to 2 bytes (only 11 bits in
IEEE-754), and the mantissa may require up to 8 bytes itself, hence 12
bytes total. Of note that, depending on Caveat 1 above, this information
may be wrong.

Closes#304

Source: https://www.oss.com/asn1/resources/books-whitepapers-pubs/larmouth-asn1-book.pdf, page 174
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Covers sections 8.5 and 11.3 of ITU-T X.690 (02/2021)
Caveats:
1. Interpretation of section 11.3.1 to be further discussed
2. Currently, all encoding is binary (no ISO 6093 NR3)
Testing of arbitrarily large and small f64s shows that DER typically
requires 12 bytes to encode these 8-byte IEEE-754 values. This can be
explained because of the extra two bytes for the tag and length, and the
fact that the exponent is encoded on 1 to 2 bytes (only 11 bits in
IEEE-754), and the mantissa may require up to 8 bytes itself, hence 12
bytes total. Of note that, depending on Caveat 1 above, this information
may be wrong.
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Comment threadder/src/asn1/real.rs Outdated
Comment threadder/src/asn1/real.rs Outdated
@tarcieri

Copy link
Copy Markdown
Member

If you can find another implementation to do interop testing with, that'd be great

ChristopherRabotinand others added 2 commits January 30, 2022 22:13
Co-authored-by: Tony Arcieri <bascule@gmail.com>
Co-authored-by: Tony Arcieri <bascule@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review. I'll add a demo encoding from the ASN1 playground

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Comment threadder/src/error.rs Outdated
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

As a quick update, I'm working on adding a bunch of validation test cases. It's gonna take some time as it seems like some of my encoding does not match the ASN1 playground so I'm going through the specs again to better understand what I didn't implement correctly. I'll keep the branch up-to-date with master.

ChristopherRabotinand others added 6 commits February 6, 2022 20:53
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
These were commented because the ASN1 playground encodes in NR3
(base 10) but this impl only encodes in base 2, so the reciprocity tests
would never have worked. Instead, all other cases were tested for
decoding in the ASN1 playground.
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

After a two months of working on other stuff, here's the updated PR with validation cases. Let me know if you have any questions.

I'm not sure why clippy is failing in the Github actions, it works locally with clippy 0.1.59 (9d1b210 2022-02-23).

Cheers

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Not sure what this CI build failed as running cargo test --no-default-features works locally and both the val and val2 variables are in fact defined.

@tarcieri

Copy link
Copy Markdown
Member

It's failing here:

https://github.com/RustCrypto/formats/runs/5669154521?check_suite_focus=true

error: there is no argument named `val`
--> der/src/asn1/real.rs:827:30
|
827 | "fail - want {val}\tgot {val2}"
| ^^^^^
error: there is no argument named `val2`
--> der/src/asn1/real.rs:827:[41](https://github.com/RustCrypto/formats/runs/5669154521?check_suite_focus=true#step:7:41)
|
827 | "fail - want {val}\tgot {val2}"
|

I think the issue is that this is using the new captured identifiers in format strings feature which was introduced in Rust 1.58, and the MSRV of the crate is 1.57, which is what the test is failing on.

Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Fixed, thanks!

Comment threadder/src/asn1/real.rs Outdated
Co-authored-by: Tony Arcieri <bascule@gmail.com>
@ChristopherRabotin

Copy link
Copy Markdown
ContributorAuthor

Thanks for the suggestion, that fixed all of the tests.

Comment threadder/src/asn1/real.rs Outdated
Signed-off-by: Christopher Rabotin <christopher.rabotin@gmail.com>
@tarcieri
tarcieri merged commit f13d734 into RustCrypto:masterMar 27, 2022
@tarcieri

Copy link
Copy Markdown
Member

Thank you!

@tarcieritarcieri mentioned this pull request May 8, 2022
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.

der: support for the REAL type

2 participants

@ChristopherRabotin@tarcieri