-
Notifications
You must be signed in to change notification settings - Fork 12.3k
Audit Fixes for RLP library on Broadcaster Audit #6106
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
Open
luiz-lvj
wants to merge
16
commits into
OpenZeppelin:master
Choose a base branch
from
luiz-lvj:audit-fixes/RLP
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+59
−14
Open
Changes from all commits
Commits
Show all changes
16 commits
Select commit
Hold shift + click to select a range
5800339
fix L-03
luiz-lvj 47c8048
fix N-06
luiz-lvj 78f643d
fix N-07
luiz-lvj 55b33a0
fix N-09
luiz-lvj e0a6e6b
add changeset
luiz-lvj f437257
Test encoding of addresses with leading zeros
Amxx 0ac8a92
Merge branch 'testing/rlp-encoding-addresses' into audit-fixes/RLP
Amxx 60b70b7
Update test/utils/RLP.test.js
Amxx 6a86e31
add fuzzing test
Amxx 08d217f
Merge branch 'testing/rlp-encoding-addresses' of https://github.com/A…
Amxx 5f11e08
Merge branch 'testing/rlp-encoding-addresses' into audit-fixes/RLP
Amxx 1992bed
revert back to address
luiz-lvj be65eb8
remove changeset
luiz-lvj 8f2dd16
update changeset
luiz-lvj 61b695f
Solve: Inconsistent Integer Base in Inline Assembly When Setting RLP …
luiz-lvj fe917b7
test string qith leading zeros
luiz-lvj File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| --- | ||
| 'openzeppelin-solidity': minor | ||
| --- | ||
|
|
||
| clarify natspec for encode functions on RLP library |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -115,17 +115,22 @@ library RLP { | |
| function encode(bool input) internal pure returns (bytes memory result) { | ||
| assembly ("memory-safe") { | ||
| result := mload(0x40) | ||
| mstore(result, 0x01) // length of the encoded data: 1 byte | ||
| mstore(result, 1) // length of the encoded data: 1 byte | ||
| mstore8(add(result, 0x20), add(mul(iszero(input), 0x7f), 1)) // input | ||
| mstore(0x40, add(result, 0x21)) // reserve memory | ||
| } | ||
| } | ||
|
|
||
| /// @dev Encode an address as RLP. | ||
| /** | ||
| * @dev Encode an address as RLP. | ||
| * | ||
| * The address is encoded with its leading zeros (if it has any). If someone wants to encode the address as a scalar, | ||
| * they can cast it to an uint256 and then call the corresponding {encode} function. | ||
| */ | ||
| function encode(address input) internal pure returns (bytes memory result) { | ||
| assembly ("memory-safe") { | ||
| result := mload(0x40) | ||
| mstore(result, 0x15) // length of the encoded data: 1 (prefix) + 0x14 (address) | ||
| mstore(result, 21) // length of the encoded data: 1 (prefix) + 0x14 (address) | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Isn't this against our guidelines?
|
||
| mstore(add(result, 0x20), or(shl(248, 0x94), shl(88, input))) // prefix (0x94 = SHORT_OFFSET + 0x14) + input | ||
| mstore(0x40, add(result, 0x35)) // reserve memory | ||
| } | ||
|
|
@@ -167,13 +172,17 @@ library RLP { | |
| return encode(bytes(input)); | ||
| } | ||
|
|
||
| /// @dev Encode an array of bytes as RLP. | ||
| /** | ||
| * @dev Encode an array of bytes as RLP. | ||
| * This function expects an array of already encoded bytes, not raw bytes. | ||
| * Users should call {encode} on each element of the array before calling it. | ||
| */ | ||
| function encode(bytes[] memory input) internal pure returns (bytes memory) { | ||
| return _encode(input.concat(), LONG_OFFSET); | ||
| } | ||
|
|
||
| /// @dev Encode an encoder (list of bytes) as RLP | ||
| function encode(Encoder memory self) internal pure returns (bytes memory result) { | ||
| function encode(Encoder memory self) internal pure returns (bytes memory) { | ||
| return _encode(self.acc.flatten(), LONG_OFFSET); | ||
| } | ||
|
|
||
|
|
@@ -241,7 +250,7 @@ library RLP { | |
| (uint256 offset, uint256 length, ItemType itemType) = _decodeLength(item); | ||
| require(itemType == ItemType.Data, RLPInvalidEncoding()); | ||
|
|
||
| // Length is checked by {toBytes} | ||
| // Length is checked by {slice} | ||
| return item.slice(offset, length).toBytes(); | ||
| } | ||
|
|
||
|
|
@@ -326,9 +335,7 @@ library RLP { | |
| * @dev Decodes an RLP `item`'s `length and type from its prefix. | ||
| * Returns the offset, length, and type of the RLP item based on the encoding rules. | ||
| */ | ||
| function _decodeLength( | ||
| Memory.Slice item | ||
| ) private pure returns (uint256 _offset, uint256 _length, ItemType _itemtype) { | ||
| function _decodeLength(Memory.Slice item) private pure returns (uint256, uint256, ItemType) { | ||
| uint256 itemLength = item.length(); | ||
|
|
||
| require(itemLength != 0, RLPInvalidEncoding()); | ||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think we need a changeset since we're not changing functionality