Skip to content

Commit

Permalink
Fuzz Base64 and Base64URL (OpenZeppelin#4853)
Browse files Browse the repository at this point in the history
Co-authored-by: Hadrien Croubois <[email protected]>
  • Loading branch information
ernestognw and Amxx authored Jan 24, 2024
1 parent e86bb45 commit 6b30d2d
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 49 deletions.
3 changes: 1 addition & 2 deletions .github/workflows/checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,7 @@ jobs:
- name: Set up environment
uses: ./.github/actions/setup
- name: Run tests
# Base64Test requires `--ffi`. See test/utils/Base64.t.sol
run: forge test -vv --no-match-contract Base64Test
run: forge test -vv

coverage:
runs-on: ubuntu-latest
Expand Down
31 changes: 0 additions & 31 deletions scripts/tests/base64.sh

This file was deleted.

33 changes: 18 additions & 15 deletions test/utils/Base64.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,30 @@ import {Test} from "forge-std/Test.sol";

import {Base64} from "@openzeppelin/contracts/utils/Base64.sol";

/// NOTE: This test requires `ffi` to be enabled. It does not run in the CI
/// environment given `ffi` is not recommended.
/// See: https://github.com/foundry-rs/foundry/issues/6744
contract Base64Test is Test {
function testEncode(bytes memory input) external {
string memory output = Base64.encode(input);
assertEq(output, _base64Ffi(input, "encode"));
assertEq(Base64.encode(input), vm.toBase64(input));
}

function testEncodeURL(bytes memory input) external {
string memory output = Base64.encodeURL(input);
assertEq(output, _base64Ffi(input, "encodeURL"));
assertEq(Base64.encodeURL(input), _removePadding(vm.toBase64URL(input)));
}

function _base64Ffi(bytes memory input, string memory fn) internal returns (string memory) {
string[] memory command = new string[](4);
command[0] = "bash";
command[1] = "scripts/tests/base64.sh";
command[2] = fn;
command[3] = vm.toString(input);
bytes memory retData = vm.ffi(command);
return string(retData);
function _removePadding(string memory inputStr) internal pure returns (string memory) {
bytes memory input = bytes(inputStr);
bytes memory output;

for (uint256 i = 0; i < input.length; ++i) {
if (input[input.length - i - 1] != 0x3d) {
output = new bytes(input.length - i);
break;
}
}

for (uint256 i = 0; i < output.length; ++i) {
output[i] = input[i];
}

return string(output);
}
}

0 comments on commit 6b30d2d

Please sign in to comment.