Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: require varints to be minimally encoded #19

Merged
merged 2 commits into from
Sep 18, 2019

Conversation

Stebalien
Copy link
Member

@Stebalien Stebalien commented Sep 18, 2019

It has been pointed out that {0x81 0x01} is technically a valid varint encoding of 0x1. Given that we tend to compare varints in byte strings, we need a 1-1 mapping between unsigned integers and encoded varints.

Library where we can enforce our constraints: https://github.com/multiformats/go-varint

@Stebalien
Copy link
Member Author

This also removes outdated information about how go implements Varint. It's no longer correct (if it ever was).

@Stebalien Stebalien merged commit b30e694 into master Sep 18, 2019
Stebalien added a commit to Stebalien/unsigned-varint that referenced this pull request Oct 27, 2021
ULEB128 technically allows any number trailing "MSB" zeros. However,
this means that there are multiple ways to encode a single number. This
is usually fine but can lead to security issues when the user assumes
that a varint will round-trip and/or that there's exactly one encoding
for some varint.

For example, code may check "is this a CID of type X" by matching the
prefix against a known-byte string. This check only works when there's
exactly one way to encode a varint.

As of multiformats/unsigned-varint#19, the
multiformats unsigned varint spec requires minimal encoding.
Stebalien added a commit to Stebalien/unsigned-varint that referenced this pull request Nov 6, 2021
ULEB128 technically allows any number trailing "MSB" zeros. However,
this means that there are multiple ways to encode a single number. This
is usually fine but can lead to security issues when the user assumes
that a varint will round-trip and/or that there's exactly one encoding
for some varint.

For example, code may check "is this a CID of type X" by matching the
prefix against a known-byte string. This check only works when there's
exactly one way to encode a varint.

As of multiformats/unsigned-varint#19, the
multiformats unsigned varint spec requires minimal encoding.
Stebalien added a commit to Stebalien/unsigned-varint that referenced this pull request Nov 6, 2021
ULEB128 technically allows any number trailing "MSB" zeros. However,
this means that there are multiple ways to encode a single number. This
is usually fine but can lead to security issues when the user assumes
that a varint will round-trip and/or that there's exactly one encoding
for some varint.

For example, code may check "is this a CID of type X" by matching the
prefix against a known-byte string. This check only works when there's
exactly one way to encode a varint.

As of multiformats/unsigned-varint#19, the
multiformats unsigned varint spec requires minimal encoding.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants