Skip to content

feat: require varints to be minimally encoded#19

Merged
Stebalien merged 2 commits into
masterfrom
feat/minimal-encoding
Sep 18, 2019
Merged

feat: require varints to be minimally encoded#19
Stebalien merged 2 commits into
masterfrom
feat/minimal-encoding

Conversation

@Stebalien

@Stebalien Stebalien commented Sep 18, 2019

Copy link
Copy Markdown
Member

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
Copy Markdown
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.

2 participants