-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This has instead been replaced with unsafe parsing of the checkpoints that skips the signature verification. This is ONLY safe becase all usages are inside the same trust boundary that signed the checkpoint. This fixes #191.
- Loading branch information
1 parent
afdb129
commit 77471c9
Showing
14 changed files
with
172 additions
and
78 deletions.
There are no files selected for viewing
This file contains 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 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 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 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 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 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 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 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,47 @@ | ||
// Copyright 2024 The Tessera authors. All Rights Reserved. | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
// | ||
// http://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
|
||
// Package parse contains internal methods for parsing data structures quickly, | ||
// if unsafely. This is a bit of a utility package which is an anti-pattern, but | ||
// this code is critical enough that it should be reused, tested, and benchmarked | ||
// rather than copied around willy nilly. | ||
// If a better home becomes available, feel free to move the contents elsewhere. | ||
package parse | ||
|
||
import ( | ||
"bytes" | ||
"fmt" | ||
"strconv" | ||
) | ||
|
||
// CheckpointUnsafe parses a checkpoint without performing any signature verification. | ||
// This is intended to be as fast as possible, but sacrifices safety because it skips verifying | ||
// the note signature. | ||
// | ||
// Parsing a checkpoint like this is only acceptable in the same binary as the | ||
// log implementation that generated it and thus we can safely assume it's a well formed and | ||
// validly signed checkpoint. Anyone copying similar logic into client code will get hurt. | ||
func CheckpointUnsafe(rawCp []byte) (string, uint64, error) { | ||
parts := bytes.SplitN(rawCp, []byte{'\n'}, 3) | ||
if want, got := 3, len(parts); want != got { | ||
return "", 0, fmt.Errorf("invalid checkpoint: %q", rawCp) | ||
} | ||
origin := string(parts[0]) | ||
sizeStr := string(parts[1]) | ||
size, err := strconv.ParseUint(sizeStr, 10, 64) | ||
if err != nil { | ||
return "", 0, fmt.Errorf("failed to turn checkpoint size of %q into uint64: %v", sizeStr, err) | ||
} | ||
return origin, size, nil | ||
} |
This file contains 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,83 @@ | ||
// Copyright 2024 The Tessera authors. All Rights Reserved. | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
// | ||
// http://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
package parse_test | ||
|
||
import ( | ||
"testing" | ||
|
||
"github.com/transparency-dev/trillian-tessera/internal/parse" | ||
) | ||
|
||
func TestCheckpointUnsafe(t *testing.T) { | ||
testCases := []struct { | ||
desc string | ||
cp string | ||
wantOrigin string | ||
wantSize uint64 | ||
wantErr bool | ||
}{ | ||
{ | ||
desc: "happy checkpoint", | ||
cp: "original.example.com\n42\nqINS1GRFhWHwdkUeqLEoP4yEMkTBBzxBkGwGQlVlVcs=\n", | ||
wantOrigin: "original.example.com", | ||
wantSize: 42, | ||
}, | ||
{ | ||
desc: "Negative size", | ||
cp: "original.example.com\n-42\nqINS1GRFhWHwdkUeqLEoP4yEMkTBBzxBkGwGQlVlVcs=\n", | ||
wantErr: true, | ||
}, | ||
{ | ||
desc: "Bad hash (passes because hashes are not checked)", | ||
cp: "original.example.com\n42\nthisisnotright\n", | ||
wantOrigin: "original.example.com", | ||
wantSize: 42, | ||
}, | ||
{ | ||
desc: "Empty origin", | ||
cp: "\n42\nthisisnotright\n", | ||
wantOrigin: "", | ||
wantSize: 42, | ||
}, | ||
{ | ||
desc: "No origin", | ||
cp: "42\nthisisnotright\n", | ||
wantErr: true, | ||
}, | ||
} | ||
for _, tC := range testCases { | ||
t.Run(tC.desc, func(t *testing.T) { | ||
origin, size, err := parse.CheckpointUnsafe([]byte(tC.cp)) | ||
if gotErr := err != nil; gotErr != tC.wantErr { | ||
t.Fatalf("gotErr != wantErr (%t != %t): %v", gotErr, tC.wantErr, err) | ||
} | ||
if tC.wantErr { | ||
return | ||
} | ||
if tC.wantOrigin != origin { | ||
t.Errorf("origin: got != want (%v != %v)", origin, tC.wantOrigin) | ||
} | ||
if tC.wantSize != size { | ||
t.Errorf("size : got != want (%v != %v)", size, tC.wantSize) | ||
} | ||
}) | ||
} | ||
} | ||
|
||
func BenchmarkCheckpointUnsafe(b *testing.B) { | ||
cpRaw := []byte("go.sum database tree\n31700353\nqINS1GRFhWHwdkUeqLEoP4yEMkTBBzxBkGwGQlVlVcs=\n\n— sum.golang.org Az3grnmrIUEDFqHzAElIQCPNoRFRAAdFo47fooyWKMHb89k11GJh5zHIfNCOBmwn/C3YI8oW9/C8DJ87F61QqspBYwM=") | ||
for i := 0; i < b.N; i++ { | ||
parse.CheckpointUnsafe(cpRaw) | ||
} | ||
} |
This file contains 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 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
Oops, something went wrong.