blob: 5e43a1caf2088c77f9da464ce36fb8a57bd6019c [file]
// Copyright 2025 The BoringSSL Authors
//
// 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
//
// https://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.
#ifndef OPENSSL_HEADER_CRYPTO_TEST_DER_TRAILING_DATA_H
#define OPENSSL_HEADER_CRYPTO_TEST_DER_TRAILING_DATA_H
#include <functional>
#include <openssl/span.h>
BSSL_NAMESPACE_BEGIN
// TestDERTrailingData decodes `in` as an arbitrary DER structure. It then calls
// `func` multiple times on different modified versions of `in`, each time with
// extra data appended to a different constructed element. The extra data will
// be a BER EOC, so this is guaranteed to make the structure invalid.
//
// `func` is expected to parse its argument and then assert with GTest that the
// parser failed. `n`, passed to `func`, is the number of the constructed
// element that was rewritten, following a pre-order numbering from zero. `func`
// should pass it to `SCOPED_TRACE` to aid debugging.
//
// TestDERTrailingData returns whether it successful rewrote `in` and called
// `func` for every constructed element.
bool TestDERTrailingData(
Span<const uint8_t> in,
std::function<void(Span<const uint8_t> rewritten, size_t n)> func);
BSSL_NAMESPACE_END
#endif // OPENSSL_HEADER_CRYPTO_TEST_DER_TRAILING_DATA_H