acvptool: factor out uploadResult Change-Id: I7fdc63786654f488b2502d6e9c3fb535a2766574 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/55605 Reviewed-by: Adam Langley <agl@google.com> Reviewed-by: David Benjamin <davidben@google.com> Commit-Queue: Adam Langley <agl@google.com>
diff --git a/util/fipstools/acvp/acvptool/acvp.go b/util/fipstools/acvp/acvptool/acvp.go index 723d29e..3e0ad44 100644 --- a/util/fipstools/acvp/acvptool/acvp.go +++ b/util/fipstools/acvp/acvptool/acvp.go
@@ -313,6 +313,54 @@ } } +func uploadResult(server *acvp.Server, setURL string, resultData []byte) error { + resultSize := uint64(len(resultData)) + 32 /* for framing overhead */ + if server.SizeLimit == 0 || resultSize < server.SizeLimit { + log.Printf("Result size %d bytes", resultSize) + return server.Post(nil, trimLeadingSlash(setURL)+"/results", resultData) + } + + // The NIST ACVP server no longer requires the large-upload process, + // suggesting that this may no longer be needed. + log.Printf("Result is %d bytes, too much given server limit of %d bytes. Using large-upload process.", resultSize, server.SizeLimit) + largeRequestBytes, err := json.Marshal(acvp.LargeUploadRequest{ + Size: resultSize, + URL: setURL, + }) + if err != nil { + return errors.New("failed to marshal large-upload request: " + err.Error()) + } + + var largeResponse acvp.LargeUploadResponse + if err := server.Post(&largeResponse, "/large", largeRequestBytes); err != nil { + return errors.New("failed to request large-upload endpoint: " + err.Error()) + } + + log.Printf("Directed to large-upload endpoint at %q", largeResponse.URL) + req, err := http.NewRequest("POST", largeResponse.URL, bytes.NewBuffer(resultData)) + if err != nil { + return errors.New("failed to create POST request: " + err.Error()) + } + token := largeResponse.AccessToken + if len(token) == 0 { + token = server.AccessToken + } + req.Header.Add("Authorization", "Bearer "+token) + req.Header.Add("Content-Type", "application/json") + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return errors.New("failed writing large upload: " + err.Error()) + } + resp.Body.Close() + if resp.StatusCode != 200 { + return fmt.Errorf("large upload resulted in status code %d", resp.StatusCode) + } + + return nil +} + func main() { flag.Parse() @@ -613,53 +661,10 @@ resultBuf.Write(replyBytes) resultBuf.WriteString("}") - resultData := resultBuf.Bytes() - resultSize := uint64(len(resultData)) + 32 /* for framing overhead */ - if server.SizeLimit > 0 && resultSize >= server.SizeLimit { - // The NIST ACVP server no longer requires the large-upload process, - // suggesting that it may no longer be needed. - log.Printf("Result is %d bytes, too much given server limit of %d bytes. Using large-upload process.", resultSize, server.SizeLimit) - largeRequestBytes, err := json.Marshal(acvp.LargeUploadRequest{ - Size: resultSize, - URL: setURL, - }) - if err != nil { - log.Printf("Failed to marshal large-upload request: %s", err) - log.Printf("Deleting test set") - server.Delete(url) - os.Exit(1) - } - - var largeResponse acvp.LargeUploadResponse - if err := server.Post(&largeResponse, "/large", largeRequestBytes); err != nil { - log.Fatalf("Failed to request large-upload endpoint: %s", err) - } - - log.Printf("Directed to large-upload endpoint at %q", largeResponse.URL) - client := &http.Client{} - req, err := http.NewRequest("POST", largeResponse.URL, bytes.NewBuffer(resultData)) - if err != nil { - log.Fatalf("Failed to create POST request: %s", err) - } - token := largeResponse.AccessToken - if len(token) == 0 { - token = server.AccessToken - } - req.Header.Add("Authorization", "Bearer "+token) - req.Header.Add("Content-Type", "application/json") - resp, err := client.Do(req) - if err != nil { - log.Fatalf("Failed writing large upload: %s", err) - } - resp.Body.Close() - if resp.StatusCode != 200 { - log.Fatalf("Large upload resulted in status code %d", resp.StatusCode) - } - } else { - log.Printf("Result size %d bytes", resultSize) - if err := server.Post(nil, trimLeadingSlash(setURL)+"/results", resultData); err != nil { - log.Fatalf("Failed to upload results: %s\n", err) - } + if err := uploadResult(server, setURL, resultBuf.Bytes()); err != nil { + log.Printf("Deleting test set") + server.Delete(url) + log.Fatal(err) } }