Browse Source

Revert "Move C++ helpers into |bssl| namespace."

This reverts commit 09feb0f3d9.

(In order to make WebRTC happy this also needs to be reverted.)
kris/onging/CECPQ3_patch15
Adam Langley 8 years ago
parent
commit
10f97f3bfc
55 changed files with 450 additions and 701 deletions
  1. +1
    -5
      crypto/asn1/asn1_test.cc
  2. +6
    -10
      crypto/bio/bio_test.cc
  3. +16
    -20
      crypto/bn/bn_test.cc
  4. +27
    -31
      crypto/bytestring/bytestring_test.cc
  5. +1
    -9
      crypto/cipher/aead_test.cc
  6. +1
    -5
      crypto/cipher/cipher_test.cc
  7. +1
    -5
      crypto/cmac/cmac_test.cc
  8. +1
    -5
      crypto/curve25519/ed25519_test.cc
  9. +4
    -8
      crypto/curve25519/spake25519_test.cc
  10. +21
    -20
      crypto/dh/dh_test.cc
  11. +1
    -9
      crypto/digest/digest_test.cc
  12. +8
    -12
      crypto/ec/ec_test.cc
  13. +8
    -13
      crypto/ecdsa/ecdsa_test.cc
  14. +1
    -9
      crypto/evp/evp_extra_test.cc
  15. +3
    -7
      crypto/evp/evp_test.cc
  16. +1
    -5
      crypto/hmac/hmac_test.cc
  17. +2
    -6
      crypto/newhope/newhope_statistical_test.cc
  18. +4
    -8
      crypto/newhope/newhope_test.cc
  19. +1
    -5
      crypto/newhope/newhope_vectors_test.cc
  20. +4
    -8
      crypto/pkcs8/pkcs12_test.cc
  21. +2
    -6
      crypto/pkcs8/pkcs8_test.cc
  22. +1
    -5
      crypto/poly1305/poly1305_test.cc
  23. +23
    -27
      crypto/rsa/rsa_test.cc
  24. +0
    -4
      crypto/test/file_test.cc
  25. +0
    -5
      crypto/test/file_test.h
  26. +92
    -44
      crypto/test/scoped_types.h
  27. +4
    -8
      crypto/x509/x509_test.cc
  28. +0
    -40
      include/openssl/base.h
  29. +0
    -12
      include/openssl/mem.h
  30. +0
    -16
      include/openssl/stack.h
  31. +207
    -215
      ssl/ssl_test.cc
  32. +0
    -4
      ssl/test/async_bio.cc
  33. +0
    -4
      ssl/test/async_bio.h
  34. +3
    -11
      ssl/test/bssl_shim.cc
  35. +0
    -4
      ssl/test/packeted_bio.cc
  36. +0
    -4
      ssl/test/packeted_bio.h
  37. +3
    -7
      ssl/test/scoped_types.h
  38. +0
    -4
      ssl/test/test_config.cc
  39. +0
    -4
      ssl/test/test_config.h
  40. +0
    -4
      tool/args.cc
  41. +0
    -4
      tool/ciphers.cc
  42. +0
    -4
      tool/client.cc
  43. +0
    -4
      tool/const.cc
  44. +0
    -4
      tool/digest.cc
  45. +0
    -4
      tool/generate_ed25519.cc
  46. +0
    -4
      tool/genrsa.cc
  47. +0
    -4
      tool/internal.h
  48. +0
    -4
      tool/pkcs12.cc
  49. +0
    -4
      tool/rand.cc
  50. +0
    -4
      tool/server.cc
  51. +0
    -4
      tool/speed.cc
  52. +1
    -10
      tool/tool.cc
  53. +0
    -4
      tool/transport_common.cc
  54. +0
    -6
      tool/transport_common.h
  55. +2
    -9
      util/doc.go

+ 1
- 5
crypto/asn1/asn1_test.cc View File

@@ -21,8 +21,6 @@
#include "../test/scoped_types.h"


namespace bssl {

// kTag128 is an ASN.1 structure with a universal tag with number 128.
static const uint8_t kTag128[] = {
0x1f, 0x81, 0x00, 0x01, 0x00,
@@ -71,12 +69,10 @@ static bool TestLargeTags() {
return true;
}

} // namespace bssl

int main() {
CRYPTO_library_init();

if (!bssl::TestLargeTags()) {
if (!TestLargeTags()) {
return 1;
}



+ 6
- 10
crypto/bio/bio_test.cc View File

@@ -43,8 +43,6 @@ OPENSSL_MSVC_PRAGMA(warning(pop))
#include "../test/scoped_types.h"


namespace bssl {

#if !defined(OPENSSL_WINDOWS)
static int closesocket(int sock) {
return close(sock);
@@ -341,7 +339,7 @@ static bool ReadASN1(bool should_succeed, const uint8_t *data, size_t data_len,
if (!ok) {
out = nullptr;
}
ScopedBytes out_storage(out);
ScopedOpenSSLBytes out_storage(out);

if (should_succeed != (ok == 1)) {
return false;
@@ -371,7 +369,7 @@ static bool TestASN1() {
static const size_t kLargePayloadLen = 8000;
static const uint8_t kLargePrefix[] = {0x30, 0x82, kLargePayloadLen >> 8,
kLargePayloadLen & 0xff};
ScopedBytes large(reinterpret_cast<uint8_t *>(
ScopedOpenSSLBytes large(reinterpret_cast<uint8_t *>(
OPENSSL_malloc(sizeof(kLargePrefix) + kLargePayloadLen)));
if (!large) {
return false;
@@ -412,8 +410,6 @@ static bool TestASN1() {
return true;
}

} // namespace bssl

int main(void) {
CRYPTO_library_init();

@@ -432,10 +428,10 @@ int main(void) {
}
#endif

if (!bssl::TestSocketConnect() ||
!bssl::TestPrintf() ||
!bssl::TestZeroCopyBioPairs() ||
!bssl::TestASN1()) {
if (!TestSocketConnect() ||
!TestPrintf() ||
!TestZeroCopyBioPairs() ||
!TestASN1()) {
return 1;
}



+ 16
- 20
crypto/bn/bn_test.cc View File

@@ -90,8 +90,6 @@
#include "../crypto/test/test_util.h"


namespace bssl {

static int HexToBIGNUM(ScopedBIGNUM *out, const char *in) {
BIGNUM *raw = NULL;
int ret = BN_hex2bn(&raw, in);
@@ -134,8 +132,8 @@ static bool ExpectBIGNUMsEqual(FileTest *t, const char *operation,
return true;
}

ScopedString expected_str(BN_bn2hex(expected));
ScopedString actual_str(BN_bn2hex(actual));
ScopedOpenSSLString expected_str(BN_bn2hex(expected));
ScopedOpenSSLString actual_str(BN_bn2hex(actual));
if (!expected_str || !actual_str) {
return false;
}
@@ -999,7 +997,7 @@ static bool TestASN1() {
CBB_cleanup(&cbb);
return false;
}
ScopedBytes delete_der(der);
ScopedOpenSSLBytes delete_der(der);
if (der_len != test.der_len ||
memcmp(der, reinterpret_cast<const uint8_t*>(test.der), der_len) != 0) {
fprintf(stderr, "Bad serialization.\n");
@@ -1265,8 +1263,6 @@ static bool TestSmallPrime(BN_CTX *ctx) {
return true;
}

} // namespace bssl

int main(int argc, char *argv[]) {
CRYPTO_library_init();

@@ -1275,24 +1271,24 @@ int main(int argc, char *argv[]) {
return 1;
}

bssl::ScopedBN_CTX ctx(BN_CTX_new());
ScopedBN_CTX ctx(BN_CTX_new());
if (!ctx) {
return 1;
}

if (!bssl::TestBN2BinPadded(ctx.get()) ||
!bssl::TestDec2BN(ctx.get()) ||
!bssl::TestHex2BN(ctx.get()) ||
!bssl::TestASC2BN(ctx.get()) ||
!bssl::TestMPI() ||
!bssl::TestRand() ||
!bssl::TestASN1() ||
!bssl::TestNegativeZero(ctx.get()) ||
!bssl::TestBadModulus(ctx.get()) ||
!bssl::TestExpModZero() ||
!bssl::TestSmallPrime(ctx.get())) {
if (!TestBN2BinPadded(ctx.get()) ||
!TestDec2BN(ctx.get()) ||
!TestHex2BN(ctx.get()) ||
!TestASC2BN(ctx.get()) ||
!TestMPI() ||
!TestRand() ||
!TestASN1() ||
!TestNegativeZero(ctx.get()) ||
!TestBadModulus(ctx.get()) ||
!TestExpModZero() ||
!TestSmallPrime(ctx.get())) {
return 1;
}

return bssl::FileTestMain(bssl::RunTest, ctx.get(), argv[1]);
return FileTestMain(RunTest, ctx.get(), argv[1]);
}

+ 27
- 31
crypto/bytestring/bytestring_test.cc View File

@@ -29,8 +29,6 @@
#include "../test/scoped_types.h"


namespace bssl {

static bool TestSkip() {
static const uint8_t kData[] = {1, 2, 3};
CBS data;
@@ -294,7 +292,7 @@ static bool TestCBBBasic() {
return false;
}

ScopedBytes scoper(buf);
ScopedOpenSSLBytes scoper(buf);
return buf_len == sizeof(kExpected) && memcmp(buf, kExpected, buf_len) == 0;
}

@@ -339,7 +337,7 @@ static bool TestCBBFinishChild() {
CBB_cleanup(&cbb);
return false;
}
ScopedBytes scoper(out_buf);
ScopedOpenSSLBytes scoper(out_buf);
return out_size == 1 && out_buf[0] == 0;
}

@@ -372,7 +370,7 @@ static bool TestCBBPrefixed() {
return false;
}

ScopedBytes scoper(buf);
ScopedOpenSSLBytes scoper(buf);
return buf_len == sizeof(kExpected) && memcmp(buf, kExpected, buf_len) == 0;
}

@@ -412,7 +410,7 @@ static bool TestCBBDiscardChild() {
if (!CBB_finish(cbb.get(), &buf, &buf_len)) {
return false;
}
ScopedBytes scoper(buf);
ScopedOpenSSLBytes scoper(buf);

static const uint8_t kExpected[] = {
0xaa,
@@ -458,7 +456,7 @@ static bool TestCBBMisuse() {
CBB_cleanup(&cbb);
return false;
}
ScopedBytes scoper(buf);
ScopedOpenSSLBytes scoper(buf);

if (buf_len != 3 ||
memcmp(buf, "\x01\x01\x02", 3) != 0) {
@@ -482,7 +480,7 @@ static bool TestCBBASN1() {
CBB_cleanup(&cbb);
return false;
}
ScopedBytes scoper(buf);
ScopedOpenSSLBytes scoper(buf);

if (buf_len != sizeof(kExpected) || memcmp(buf, kExpected, buf_len) != 0) {
return false;
@@ -557,7 +555,7 @@ static bool DoBerConvert(const char *name,
fprintf(stderr, "%s: CBS_asn1_ber_to_der failed.\n", name);
return false;
}
ScopedBytes scoper(out);
ScopedOpenSSLBytes scoper(out);

if (out == NULL) {
if (ber_len != der_len ||
@@ -670,7 +668,7 @@ static bool TestImplicitString() {
int ok = CBS_get_asn1_implicit_string(&in, &out, &storage,
CBS_ASN1_CONTEXT_SPECIFIC | 0,
CBS_ASN1_OCTETSTRING);
ScopedBytes scoper(storage);
ScopedOpenSSLBytes scoper(storage);

if (static_cast<bool>(ok) != test.ok) {
fprintf(stderr, "CBS_get_asn1_implicit_string unexpectedly %s\n",
@@ -749,7 +747,7 @@ static bool TestASN1Uint64() {
CBB_cleanup(&cbb);
return false;
}
ScopedBytes scoper(out);
ScopedOpenSSLBytes scoper(out);
if (len != test->encoding_len || memcmp(out, test->encoding, len) != 0) {
return false;
}
@@ -799,29 +797,27 @@ static bool TestCBBReserve() {
return true;
}

} // namespace bssl

int main(void) {
CRYPTO_library_init();

if (!bssl::TestSkip() ||
!bssl::TestGetUint() ||
!bssl::TestGetPrefixed() ||
!bssl::TestGetPrefixedBad() ||
!bssl::TestGetASN1() ||
!bssl::TestCBBBasic() ||
!bssl::TestCBBFixed() ||
!bssl::TestCBBFinishChild() ||
!bssl::TestCBBMisuse() ||
!bssl::TestCBBPrefixed() ||
!bssl::TestCBBDiscardChild() ||
!bssl::TestCBBASN1() ||
!bssl::TestBerConvert() ||
!bssl::TestImplicitString() ||
!bssl::TestASN1Uint64() ||
!bssl::TestGetOptionalASN1Bool() ||
!bssl::TestZero() ||
!bssl::TestCBBReserve()) {
if (!TestSkip() ||
!TestGetUint() ||
!TestGetPrefixed() ||
!TestGetPrefixedBad() ||
!TestGetASN1() ||
!TestCBBBasic() ||
!TestCBBFixed() ||
!TestCBBFinishChild() ||
!TestCBBMisuse() ||
!TestCBBPrefixed() ||
!TestCBBDiscardChild() ||
!TestCBBASN1() ||
!TestBerConvert() ||
!TestImplicitString() ||
!TestASN1Uint64() ||
!TestGetOptionalASN1Bool() ||
!TestZero() ||
!TestCBBReserve()) {
return 1;
}



+ 1
- 9
crypto/cipher/aead_test.cc View File

@@ -25,8 +25,6 @@
#include "../test/scoped_types.h"


namespace bssl {

// This program tests an AEAD against a series of test vectors from a file,
// using the FileTest format. As an example, here's a valid test case:
//
@@ -329,7 +327,7 @@ static const struct KnownAEAD kAEADs[] = {
{ "", NULL, false },
};

static int Main(int argc, char **argv) {
int main(int argc, char **argv) {
CRYPTO_library_init();

if (argc != 3) {
@@ -362,9 +360,3 @@ static int Main(int argc, char **argv) {

return FileTestMain(TestAEAD, const_cast<EVP_AEAD*>(aead), argv[2]);
}

} // namespace bssl

int main(int argc, char **argv) {
return bssl::Main(argc, argv);
}

+ 1
- 5
crypto/cipher/cipher_test.cc View File

@@ -65,8 +65,6 @@
#include "../test/scoped_types.h"


namespace bssl {

static const EVP_CIPHER *GetCipher(const std::string &name) {
if (name == "DES-CBC") {
return EVP_des_cbc();
@@ -286,8 +284,6 @@ static bool TestCipher(FileTest *t, void *arg) {
return true;
}

} // namespace bssl

int main(int argc, char **argv) {
CRYPTO_library_init();

@@ -296,5 +292,5 @@ int main(int argc, char **argv) {
return 1;
}

return bssl::FileTestMain(bssl::TestCipher, nullptr, argv[1]);
return FileTestMain(TestCipher, nullptr, argv[1]);
}

+ 1
- 5
crypto/cmac/cmac_test.cc View File

@@ -22,8 +22,6 @@
#include "../test/test_util.h"


namespace bssl {

static void dump(const uint8_t *got, const uint8_t *want, size_t len) {
hexdump(stderr, "got :", got, len);
hexdump(stderr, "want:", want, len);
@@ -143,10 +141,8 @@ static int rfc_4493_test_vectors(void) {
return 1;
}

} // namespace bssl

int main(int argc, char **argv) {
if (!bssl::rfc_4493_test_vectors()) {
if (!rfc_4493_test_vectors()) {
return 1;
}



+ 1
- 5
crypto/curve25519/ed25519_test.cc View File

@@ -20,8 +20,6 @@
#include "../test/file_test.h"


namespace bssl {

static bool TestSignature(FileTest *t, void *arg) {
std::vector<uint8_t> private_key, public_key, message, expected_signature;
if (!t->GetBytes(&private_key, "PRIV") ||
@@ -55,13 +53,11 @@ static bool TestSignature(FileTest *t, void *arg) {
return true;
}

} // namespace bssl

int main(int argc, char **argv) {
if (argc != 2) {
fprintf(stderr, "%s <test input.txt>\n", argv[0]);
return 1;
}

return bssl::FileTestMain(bssl::TestSignature, nullptr, argv[1]);
return FileTestMain(TestSignature, nullptr, argv[1]);
}

+ 4
- 8
crypto/curve25519/spake25519_test.cc View File

@@ -22,8 +22,6 @@
#include "../test/scoped_types.h"


namespace bssl {

struct SPAKE2Run {
bool Run() {
ScopedSPAKE2_CTX alice(SPAKE2_CTX_new(
@@ -156,15 +154,13 @@ static bool TestCorruptMessages() {
return true;
}

} // namespace bssl

/* TODO(agl): add tests with fixed vectors once SPAKE2 is nailed down. */

int main(int argc, char **argv) {
if (!bssl::TestSPAKE2() ||
!bssl::TestWrongPassword() ||
!bssl::TestWrongNames() ||
!bssl::TestCorruptMessages()) {
if (!TestSPAKE2() ||
!TestWrongPassword() ||
!TestWrongNames() ||
!TestCorruptMessages()) {
return 1;
}



+ 21
- 20
crypto/dh/dh_test.cc View File

@@ -71,7 +71,25 @@
#include "../test/scoped_types.h"


namespace bssl {
static bool RunBasicTests();
static bool RunRFC5114Tests();
static bool TestBadY();
static bool TestASN1();

int main(int argc, char *argv[]) {
CRYPTO_library_init();

if (!RunBasicTests() ||
!RunRFC5114Tests() ||
!TestBadY() ||
!TestASN1()) {
ERR_print_errors_fp(stderr);
return 1;
}

printf("PASS\n");
return 0;
}

static int GenerateCallback(int p, int n, BN_GENCB *arg) {
char c = '*';
@@ -557,7 +575,7 @@ static bool TestASN1() {
!CBB_finish(cbb.get(), &der, &der_len)) {
return false;
}
ScopedBytes free_der(der);
ScopedOpenSSLBytes free_der(der);
if (der_len != sizeof(kParams) || memcmp(der, kParams, der_len) != 0) {
return false;
}
@@ -599,27 +617,10 @@ static bool TestASN1() {
!CBB_finish(cbb.get(), &der, &der_len)) {
return false;
}
ScopedBytes free_der2(der);
ScopedOpenSSLBytes free_der2(der);
if (der_len != sizeof(kParamsDSA) || memcmp(der, kParamsDSA, der_len) != 0) {
return false;
}

return true;
}

} // namespace bssl

int main(int argc, char *argv[]) {
CRYPTO_library_init();

if (!bssl::RunBasicTests() ||
!bssl::RunRFC5114Tests() ||
!bssl::TestBadY() ||
!bssl::TestASN1()) {
ERR_print_errors_fp(stderr);
return 1;
}

printf("PASS\n");
return 0;
}

+ 1
- 9
crypto/digest/digest_test.cc View File

@@ -26,8 +26,6 @@
#include "../test/scoped_types.h"


namespace bssl {

struct MD {
// name is the name of the digest.
const char* name;
@@ -245,7 +243,7 @@ static int TestGetters() {
return true;
}

static int Main() {
int main(void) {
CRYPTO_library_init();

for (size_t i = 0; i < sizeof(kTestVectors) / sizeof(kTestVectors[0]); i++) {
@@ -262,9 +260,3 @@ static int Main() {
printf("PASS\n");
return 0;
}

} // namespace bssl

int main() {
return bssl::Main();
}

+ 8
- 12
crypto/ec/ec_test.cc View File

@@ -26,8 +26,6 @@
#include "../test/scoped_types.h"


namespace bssl {

// kECKeyWithoutPublic is an ECPrivateKey with the optional publicKey field
// omitted.
static const uint8_t kECKeyWithoutPublic[] = {
@@ -163,8 +161,8 @@ static bool Testd2i_ECPrivateKey() {
fprintf(stderr, "Failed to get public key in affine coordinates.\n");
return false;
}
ScopedString x_hex(BN_bn2hex(x.get()));
ScopedString y_hex(BN_bn2hex(y.get()));
ScopedOpenSSLString x_hex(BN_bn2hex(x.get()));
ScopedOpenSSLString y_hex(BN_bn2hex(y.get()));
if (!x_hex || !y_hex) {
return false;
}
@@ -473,17 +471,15 @@ static bool ForEachCurve(bool (*test_func)(int nid)) {
return true;
}

} // namespace bssl

int main(void) {
CRYPTO_library_init();

if (!bssl::Testd2i_ECPrivateKey() ||
!bssl::TestZeroPadding() ||
!bssl::TestSpecifiedCurve() ||
!bssl::ForEachCurve(bssl::TestSetAffine) ||
!bssl::ForEachCurve(bssl::TestAddingEqualPoints) ||
!bssl::TestArbitraryCurve()) {
if (!Testd2i_ECPrivateKey() ||
!TestZeroPadding() ||
!TestSpecifiedCurve() ||
!ForEachCurve(TestSetAffine) ||
!ForEachCurve(TestAddingEqualPoints) ||
!TestArbitraryCurve()) {
fprintf(stderr, "failed\n");
return 1;
}


+ 8
- 13
crypto/ecdsa/ecdsa_test.cc View File

@@ -64,9 +64,6 @@

#include "../test/scoped_types.h"


namespace bssl {

enum Api {
kEncodedApi,
kRawApi,
@@ -85,7 +82,7 @@ static bool VerifyECDSASig(Api api, const uint8_t *digest,
if (!ECDSA_SIG_to_bytes(&der, &der_len, ecdsa_sig)) {
return false;
}
ScopedBytes delete_der(der);
ScopedOpenSSLBytes delete_der(der);
actual_result = ECDSA_verify(0, digest, digest_len, der, der_len, eckey);
break;
}
@@ -331,7 +328,7 @@ static bool TestECDSA_SIG_max_len(size_t order_len) {
if (!ECDSA_SIG_to_bytes(&der, &der_len, sig.get())) {
return false;
}
ScopedBytes delete_der(der);
ScopedOpenSSLBytes delete_der(der);

size_t max_len = ECDSA_SIG_max_len(order_len);
if (max_len != der_len) {
@@ -343,8 +340,6 @@ static bool TestECDSA_SIG_max_len(size_t order_len) {
return true;
}

} // namespace bssl

static size_t BitsToBytes(size_t bits) {
return (bits / 8) + (7 + (bits % 8)) / 8;
}
@@ -352,12 +347,12 @@ static size_t BitsToBytes(size_t bits) {
int main(void) {
CRYPTO_library_init();

if (!bssl::TestBuiltin(stdout) ||
!bssl::TestECDSA_SIG_max_len(BitsToBytes(224)) ||
!bssl::TestECDSA_SIG_max_len(BitsToBytes(256)) ||
!bssl::TestECDSA_SIG_max_len(BitsToBytes(384)) ||
!bssl::TestECDSA_SIG_max_len(BitsToBytes(521)) ||
!bssl::TestECDSA_SIG_max_len(BitsToBytes(10000))) {
if (!TestBuiltin(stdout) ||
!TestECDSA_SIG_max_len(BitsToBytes(224)) ||
!TestECDSA_SIG_max_len(BitsToBytes(256)) ||
!TestECDSA_SIG_max_len(BitsToBytes(384)) ||
!TestECDSA_SIG_max_len(BitsToBytes(521)) ||
!TestECDSA_SIG_max_len(BitsToBytes(10000))) {
printf("\nECDSA test failed\n");
ERR_print_errors_fp(stdout);
return 1;


+ 1
- 9
crypto/evp/evp_extra_test.cc View File

@@ -30,8 +30,6 @@
#include "../test/scoped_types.h"


namespace bssl {

// kExampleRSAKeyDER is an RSA private key in ASN.1, DER format. Of course, you
// should never use this key anywhere but in an example.
static const uint8_t kExampleRSAKeyDER[] = {
@@ -673,7 +671,7 @@ static bool Testd2i_PrivateKey(void) {
return true;
}

static int Main() {
int main(void) {
CRYPTO_library_init();

if (!TestEVP_DigestSignInit()) {
@@ -721,9 +719,3 @@ static int Main() {
printf("PASS\n");
return 0;
}

} // namespace bssl

int main() {
return bssl::Main();
}

+ 3
- 7
crypto/evp/evp_test.cc View File

@@ -77,8 +77,6 @@ OPENSSL_MSVC_PRAGMA(warning(pop))
#include "../test/scoped_types.h"


namespace bssl {

// evp_test dispatches between multiple test types. PrivateKey tests take a key
// name parameter and single block, decode it as a PEM private key, and save it
// under that key name. Decrypt, Sign, and Verify tests take a previously
@@ -151,7 +149,7 @@ static bool ImportKey(FileTest *t, KeyMap *key_map,
!CBB_finish(cbb.get(), &der, &der_len)) {
return false;
}
ScopedBytes free_der(der);
ScopedOpenSSLBytes free_der(der);

std::vector<uint8_t> output = input;
if (t->HasAttribute("Output") &&
@@ -255,8 +253,6 @@ static bool TestEVP(FileTest *t, void *arg) {
return true;
}

} // namespace bssl

int main(int argc, char **argv) {
CRYPTO_library_init();
if (argc != 2) {
@@ -264,6 +260,6 @@ int main(int argc, char **argv) {
return 1;
}

bssl::KeyMap map;
return bssl::FileTestMain(bssl::TestEVP, &map, argv[1]);
KeyMap map;
return FileTestMain(TestEVP, &map, argv[1]);
}

+ 1
- 5
crypto/hmac/hmac_test.cc View File

@@ -68,8 +68,6 @@
#include "../test/scoped_types.h"


namespace bssl {

static const EVP_MD *GetDigest(const std::string &name) {
if (name == "MD5") {
return EVP_md5();
@@ -154,8 +152,6 @@ static bool TestHMAC(FileTest *t, void *arg) {
return true;
}

} // namespace bssl

int main(int argc, char *argv[]) {
CRYPTO_library_init();

@@ -164,5 +160,5 @@ int main(int argc, char *argv[]) {
return 1;
}

return bssl::FileTestMain(bssl::TestHMAC, nullptr, argv[1]);
return FileTestMain(TestHMAC, nullptr, argv[1]);
}

+ 2
- 6
crypto/newhope/newhope_statistical_test.cc View File

@@ -25,8 +25,6 @@
#include "internal.h"


namespace bssl {

static const unsigned kNumTests = 1000;

static bool TestNoise(void) {
@@ -148,11 +146,9 @@ static bool TestKeys(void) {
return true;
}

} // namespace bssl

int main(void) {
if (!bssl::TestKeys() ||
!bssl::TestNoise()) {
if (!TestKeys() ||
!TestNoise()) {
return 1;
}
printf("PASS\n");


+ 4
- 8
crypto/newhope/newhope_test.cc View File

@@ -23,8 +23,6 @@
#include "internal.h"


namespace bssl {

// Set to 10 for quick execution. Tested up to 1,000,000.
static const int kNumTests = 10;

@@ -130,13 +128,11 @@ static bool TestInvalidAcceptMsg(void) {
return true;
}

} // namespace bssl

int main(void) {
for (int i = 0; i < bssl::kNumTests; i++) {
if (!bssl::TestKeys() ||
!bssl::TestInvalidSK() ||
!bssl::TestInvalidAcceptMsg()) {
for (int i = 0; i < kNumTests; i++) {
if (!TestKeys() ||
!TestInvalidSK() ||
!TestInvalidAcceptMsg()) {
return 1;
}
}


+ 1
- 5
crypto/newhope/newhope_vectors_test.cc View File

@@ -24,8 +24,6 @@
#include "internal.h"


namespace bssl {

static bool TestNewhope(FileTest *t, void *arg) {
ScopedNEWHOPE_POLY a(NEWHOPE_POLY_new());
ScopedNEWHOPE_POLY s(NEWHOPE_POLY_new()), sp(NEWHOPE_POLY_new());
@@ -112,8 +110,6 @@ static bool TestNewhope(FileTest *t, void *arg) {
}
}

} // namespace bssl

int main(int argc, char **argv) {
CRYPTO_library_init();

@@ -122,5 +118,5 @@ int main(int argc, char **argv) {
return 1;
}

return bssl::FileTestMain(bssl::TestNewhope, nullptr, argv[1]);
return FileTestMain(TestNewhope, nullptr, argv[1]);
}

+ 4
- 8
crypto/pkcs8/pkcs12_test.cc View File

@@ -681,8 +681,6 @@ static const uint8_t kWindows[] = {
0xfe, 0x3a, 0x66, 0x47, 0x40, 0x49, 0x02, 0x02, 0x07, 0xd0,
};

namespace bssl {

static const char kPassword[] = "foo";

static bool Test(const char *name, const uint8_t *der, size_t der_len) {
@@ -757,15 +755,13 @@ static bool TestCompat(const uint8_t *der, size_t der_len) {
return true;
}

} // namespace bssl

int main(int argc, char **argv) {
CRYPTO_library_init();

if (!bssl::Test("OpenSSL", kOpenSSL, sizeof(kOpenSSL)) ||
!bssl::Test("NSS", kNSS, sizeof(kNSS)) ||
!bssl::Test("Windows", kWindows, sizeof(kWindows)) ||
!bssl::TestCompat(kWindows, sizeof(kWindows))) {
if (!Test("OpenSSL", kOpenSSL, sizeof(kOpenSSL)) ||
!Test("NSS", kNSS, sizeof(kNSS)) ||
!Test("Windows", kWindows, sizeof(kWindows)) ||
!TestCompat(kWindows, sizeof(kWindows))) {
return 1;
}



+ 2
- 6
crypto/pkcs8/pkcs8_test.cc View File

@@ -62,9 +62,7 @@ static const uint8_t kDER[] = {
0xd6, 0x2d,
};

namespace bssl {

static bool Test(const uint8_t *der, size_t der_len) {
static bool test(const uint8_t *der, size_t der_len) {
const uint8_t *data = der;
ScopedX509_SIG sig(d2i_X509_SIG(NULL, &data, der_len));
if (sig.get() == NULL || data != der + der_len) {
@@ -83,10 +81,8 @@ static bool Test(const uint8_t *der, size_t der_len) {
return true;
}

} // namespace bssl

int main(int argc, char **argv) {
if (!bssl::Test(kDER, sizeof(kDER))) {
if (!test(kDER, sizeof(kDER))) {
return 1;
}



+ 1
- 5
crypto/poly1305/poly1305_test.cc View File

@@ -24,8 +24,6 @@
#include "../test/file_test.h"


namespace bssl {

static bool TestSIMD(FileTest *t, unsigned excess,
const std::vector<uint8_t> &key,
const std::vector<uint8_t> &in,
@@ -121,8 +119,6 @@ static bool TestPoly1305(FileTest *t, void *arg) {
return true;
}

} // namespace bssl

int main(int argc, char **argv) {
CRYPTO_library_init();

@@ -131,5 +127,5 @@ int main(int argc, char **argv) {
return 1;
}

return bssl::FileTestMain(bssl::TestPoly1305, nullptr, argv[1]);
return FileTestMain(TestPoly1305, nullptr, argv[1]);
}

+ 23
- 27
crypto/rsa/rsa_test.cc View File

@@ -523,8 +523,6 @@ static const uint8_t kExponent1RSAKey[] = {
0xdd, 0x02, 0x01, 0x01,
};

namespace bssl {

static bool TestRSA(const uint8_t *der, size_t der_len,
const uint8_t *oaep_ciphertext,
size_t oaep_ciphertext_len) {
@@ -857,7 +855,7 @@ static bool TestASN1() {
if (!RSA_private_key_to_bytes(&der, &der_len, rsa.get())) {
return false;
}
ScopedBytes delete_der(der);
ScopedOpenSSLBytes delete_der(der);
if (der_len != sizeof(kKey1) - 1 || memcmp(der, kKey1, der_len) != 0) {
return false;
}
@@ -880,7 +878,7 @@ static bool TestASN1() {
if (!RSA_public_key_to_bytes(&der2, &der2_len, rsa.get())) {
return false;
}
ScopedBytes delete_der2(der2);
ScopedOpenSSLBytes delete_der2(der2);
if (der_len != der2_len || memcmp(der, der2, der_len) != 0) {
return false;
}
@@ -924,32 +922,30 @@ static bool TestBadExponent() {
return true;
}

} // namespace bssl

int main(int argc, char *argv[]) {
CRYPTO_library_init();

if (!bssl::TestRSA(kKey1, sizeof(kKey1) - 1, kOAEPCiphertext1,
sizeof(kOAEPCiphertext1) - 1) ||
!bssl::TestRSA(kKey2, sizeof(kKey2) - 1, kOAEPCiphertext2,
sizeof(kOAEPCiphertext2) - 1) ||
!bssl::TestRSA(kKey3, sizeof(kKey3) - 1, kOAEPCiphertext3,
sizeof(kOAEPCiphertext3) - 1) ||
!bssl::TestOnlyDGiven() ||
!bssl::TestRecoverCRTParams() ||
!bssl::TestBadKey() ||
!bssl::TestMultiPrimeKey(2, kTwoPrimeKey, sizeof(kTwoPrimeKey) - 1,
kTwoPrimeEncryptedMessage,
sizeof(kTwoPrimeEncryptedMessage)) ||
!bssl::TestMultiPrimeKey(3, kThreePrimeKey, sizeof(kThreePrimeKey) - 1,
kThreePrimeEncryptedMessage,
sizeof(kThreePrimeEncryptedMessage)) ||
!bssl::TestMultiPrimeKey(6, kSixPrimeKey, sizeof(kSixPrimeKey) - 1,
kSixPrimeEncryptedMessage,
sizeof(kSixPrimeEncryptedMessage)) ||
!bssl::TestMultiPrimeKeygen() ||
!bssl::TestASN1() ||
!bssl::TestBadExponent()) {
if (!TestRSA(kKey1, sizeof(kKey1) - 1, kOAEPCiphertext1,
sizeof(kOAEPCiphertext1) - 1) ||
!TestRSA(kKey2, sizeof(kKey2) - 1, kOAEPCiphertext2,
sizeof(kOAEPCiphertext2) - 1) ||
!TestRSA(kKey3, sizeof(kKey3) - 1, kOAEPCiphertext3,
sizeof(kOAEPCiphertext3) - 1) ||
!TestOnlyDGiven() ||
!TestRecoverCRTParams() ||
!TestBadKey() ||
!TestMultiPrimeKey(2, kTwoPrimeKey, sizeof(kTwoPrimeKey) - 1,
kTwoPrimeEncryptedMessage,
sizeof(kTwoPrimeEncryptedMessage)) ||
!TestMultiPrimeKey(3, kThreePrimeKey, sizeof(kThreePrimeKey) - 1,
kThreePrimeEncryptedMessage,
sizeof(kThreePrimeEncryptedMessage)) ||
!TestMultiPrimeKey(6, kSixPrimeKey, sizeof(kSixPrimeKey) - 1,
kSixPrimeEncryptedMessage,
sizeof(kSixPrimeEncryptedMessage)) ||
!TestMultiPrimeKeygen() ||
!TestASN1() ||
!TestBadExponent()) {
return 1;
}



+ 0
- 4
crypto/test/file_test.cc View File

@@ -25,8 +25,6 @@
#include <openssl/err.h>


namespace bssl {

FileTest::FileTest(const char *path) {
file_ = fopen(path, "r");
if (file_ == nullptr) {
@@ -302,5 +300,3 @@ int FileTestMain(bool (*run_test)(FileTest *t, void *arg), void *arg,
printf("PASS\n");
return 0;
}

} // namespace bssl

+ 0
- 5
crypto/test/file_test.h View File

@@ -30,9 +30,6 @@ OPENSSL_MSVC_PRAGMA(warning(disable: 4702))

OPENSSL_MSVC_PRAGMA(warning(pop))


namespace bssl {

// File-based test framework.
//
// This module provides a file-based test framework. The file format is based on
@@ -156,7 +153,5 @@ class FileTest {
int FileTestMain(bool (*run_test)(FileTest *t, void *arg), void *arg,
const char *path);

} // namespace bssl


#endif /* OPENSSL_HEADER_CRYPTO_TEST_FILE_TEST_H */

+ 92
- 44
crypto/test/scoped_types.h View File

@@ -15,8 +15,6 @@
#ifndef OPENSSL_HEADER_CRYPTO_TEST_SCOPED_TYPES_H
#define OPENSSL_HEADER_CRYPTO_TEST_SCOPED_TYPES_H

#include <openssl/base.h>

#include <stdint.h>
#include <stdio.h>

@@ -42,7 +40,28 @@
#include <openssl/stack.h>
#include <openssl/x509.h>

namespace bssl {

template<typename T, void (*func)(T*)>
struct OpenSSLDeleter {
void operator()(T *obj) {
func(obj);
}
};

template<typename StackType, typename T, void (*func)(T*)>
struct OpenSSLStackDeleter {
void operator()(StackType *obj) {
sk_pop_free(reinterpret_cast<_STACK*>(obj),
reinterpret_cast<void (*)(void *)>(func));
}
};

template<typename T>
struct OpenSSLFree {
void operator()(T *buf) {
OPENSSL_free(buf);
}
};

struct FileCloser {
void operator()(FILE *file) {
@@ -50,48 +69,77 @@ struct FileCloser {
}
};

using ScopedASN1_TYPE = ScopedType<ASN1_TYPE, ASN1_TYPE_free>;
using ScopedBIO = ScopedType<BIO, BIO_vfree>;
using ScopedBIGNUM = ScopedType<BIGNUM, BN_free>;
using ScopedBN_CTX = ScopedType<BN_CTX, BN_CTX_free>;
using ScopedBN_MONT_CTX = ScopedType<BN_MONT_CTX, BN_MONT_CTX_free>;
using ScopedCMAC_CTX = ScopedType<CMAC_CTX, CMAC_CTX_free>;
using ScopedDH = ScopedType<DH, DH_free>;
using ScopedECDSA_SIG = ScopedType<ECDSA_SIG, ECDSA_SIG_free>;
using ScopedEC_GROUP = ScopedType<EC_GROUP, EC_GROUP_free>;
using ScopedEC_KEY = ScopedType<EC_KEY, EC_KEY_free>;
using ScopedEC_POINT = ScopedType<EC_POINT, EC_POINT_free>;
using ScopedEVP_PKEY = ScopedType<EVP_PKEY, EVP_PKEY_free>;
using ScopedEVP_PKEY_CTX = ScopedType<EVP_PKEY_CTX, EVP_PKEY_CTX_free>;
using ScopedNEWHOPE_POLY = ScopedType<NEWHOPE_POLY, NEWHOPE_POLY_free>;
using ScopedPKCS8_PRIV_KEY_INFO =
ScopedType<PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_free>;
using ScopedPKCS12 = ScopedType<PKCS12, PKCS12_free>;
using ScopedSPAKE2_CTX = ScopedType<SPAKE2_CTX, SPAKE2_CTX_free>;
using ScopedRSA = ScopedType<RSA, RSA_free>;
using ScopedX509 = ScopedType<X509, X509_free>;
using ScopedX509_ALGOR = ScopedType<X509_ALGOR, X509_ALGOR_free>;
using ScopedX509_SIG = ScopedType<X509_SIG, X509_SIG_free>;
using ScopedX509_STORE_CTX = ScopedType<X509_STORE_CTX, X509_STORE_CTX_free>;

using ScopedX509Stack = ScopedStack<STACK_OF(X509), X509, X509_free>;

using ScopedCBB = ScopedContext<CBB, void, CBB_zero, CBB_cleanup>;
using ScopedEVP_AEAD_CTX =
ScopedContext<EVP_AEAD_CTX, void, EVP_AEAD_CTX_zero, EVP_AEAD_CTX_cleanup>;
using ScopedEVP_CIPHER_CTX =
ScopedContext<EVP_CIPHER_CTX, int, EVP_CIPHER_CTX_init,
EVP_CIPHER_CTX_cleanup>;
using ScopedEVP_MD_CTX =
ScopedContext<EVP_MD_CTX, int, EVP_MD_CTX_init, EVP_MD_CTX_cleanup>;
using ScopedHMAC_CTX =
ScopedContext<HMAC_CTX, void, HMAC_CTX_init, HMAC_CTX_cleanup>;

using ScopedBytes = std::unique_ptr<uint8_t, Free<uint8_t>>;
using ScopedString = std::unique_ptr<char, Free<char>>;
template<typename T, void (*func)(T*)>
using ScopedOpenSSLType = std::unique_ptr<T, OpenSSLDeleter<T, func>>;

using ScopedFILE = std::unique_ptr<FILE, FileCloser>;
template<typename StackType, typename T, void (*func)(T*)>
using ScopedOpenSSLStack =
std::unique_ptr<StackType, OpenSSLStackDeleter<StackType, T, func>>;

template<typename T, typename CleanupRet, void (*init_func)(T*),
CleanupRet (*cleanup_func)(T*)>
class ScopedOpenSSLContext {
public:
ScopedOpenSSLContext() {
init_func(&ctx_);
}
~ScopedOpenSSLContext() {
cleanup_func(&ctx_);
}

T *get() { return &ctx_; }
const T *get() const { return &ctx_; }

void Reset() {
cleanup_func(&ctx_);
init_func(&ctx_);
}

private:
T ctx_;
};

using ScopedASN1_TYPE = ScopedOpenSSLType<ASN1_TYPE, ASN1_TYPE_free>;
using ScopedBIO = ScopedOpenSSLType<BIO, BIO_vfree>;
using ScopedBIGNUM = ScopedOpenSSLType<BIGNUM, BN_free>;
using ScopedBN_CTX = ScopedOpenSSLType<BN_CTX, BN_CTX_free>;
using ScopedBN_MONT_CTX = ScopedOpenSSLType<BN_MONT_CTX, BN_MONT_CTX_free>;
using ScopedCMAC_CTX = ScopedOpenSSLType<CMAC_CTX, CMAC_CTX_free>;
using ScopedDH = ScopedOpenSSLType<DH, DH_free>;
using ScopedECDSA_SIG = ScopedOpenSSLType<ECDSA_SIG, ECDSA_SIG_free>;
using ScopedEC_GROUP = ScopedOpenSSLType<EC_GROUP, EC_GROUP_free>;
using ScopedEC_KEY = ScopedOpenSSLType<EC_KEY, EC_KEY_free>;
using ScopedEC_POINT = ScopedOpenSSLType<EC_POINT, EC_POINT_free>;
using ScopedEVP_PKEY = ScopedOpenSSLType<EVP_PKEY, EVP_PKEY_free>;
using ScopedEVP_PKEY_CTX = ScopedOpenSSLType<EVP_PKEY_CTX, EVP_PKEY_CTX_free>;
using ScopedNEWHOPE_POLY = ScopedOpenSSLType<NEWHOPE_POLY, NEWHOPE_POLY_free>;
using ScopedPKCS8_PRIV_KEY_INFO = ScopedOpenSSLType<PKCS8_PRIV_KEY_INFO,
PKCS8_PRIV_KEY_INFO_free>;
using ScopedPKCS12 = ScopedOpenSSLType<PKCS12, PKCS12_free>;
using ScopedSPAKE2_CTX = ScopedOpenSSLType<SPAKE2_CTX, SPAKE2_CTX_free>;
using ScopedRSA = ScopedOpenSSLType<RSA, RSA_free>;
using ScopedX509 = ScopedOpenSSLType<X509, X509_free>;
using ScopedX509_ALGOR = ScopedOpenSSLType<X509_ALGOR, X509_ALGOR_free>;
using ScopedX509_SIG = ScopedOpenSSLType<X509_SIG, X509_SIG_free>;
using ScopedX509_STORE_CTX = ScopedOpenSSLType<X509_STORE_CTX, X509_STORE_CTX_free>;

using ScopedX509Stack = ScopedOpenSSLStack<STACK_OF(X509), X509, X509_free>;

} // namespace bssl
using ScopedCBB = ScopedOpenSSLContext<CBB, void, CBB_zero, CBB_cleanup>;
using ScopedEVP_AEAD_CTX = ScopedOpenSSLContext<EVP_AEAD_CTX, void,
EVP_AEAD_CTX_zero,
EVP_AEAD_CTX_cleanup>;
using ScopedEVP_CIPHER_CTX = ScopedOpenSSLContext<EVP_CIPHER_CTX, int,
EVP_CIPHER_CTX_init,
EVP_CIPHER_CTX_cleanup>;
using ScopedEVP_MD_CTX = ScopedOpenSSLContext<EVP_MD_CTX, int, EVP_MD_CTX_init,
EVP_MD_CTX_cleanup>;
using ScopedHMAC_CTX = ScopedOpenSSLContext<HMAC_CTX, void, HMAC_CTX_init,
HMAC_CTX_cleanup>;

using ScopedOpenSSLBytes = std::unique_ptr<uint8_t, OpenSSLFree<uint8_t>>;
using ScopedOpenSSLString = std::unique_ptr<char, OpenSSLFree<char>>;

using ScopedFILE = std::unique_ptr<FILE, FileCloser>;

#endif // OPENSSL_HEADER_CRYPTO_TEST_SCOPED_TYPES_H

+ 4
- 8
crypto/x509/x509_test.cc View File

@@ -27,8 +27,6 @@
#include "../test/scoped_types.h"


namespace bssl {

static const char kCrossSigningRootPEM[] =
"-----BEGIN CERTIFICATE-----\n"
"MIICcTCCAdqgAwIBAgIIagJHiPvE0MowDQYJKoZIhvcNAQELBQAwPDEaMBgGA1UE\n"
@@ -459,15 +457,13 @@ static bool TestSignCtx() {
return true;
}

} // namespace bssl

int main(int argc, char **argv) {
CRYPTO_library_init();

if (!bssl::TestVerify() ||
!bssl::TestPSS() ||
!bssl::TestBadPSSParameters() ||
!bssl::TestSignCtx()) {
if (!TestVerify() ||
!TestPSS() ||
!TestBadPSSParameters() ||
!TestSignCtx()) {
return 1;
}



+ 0
- 40
include/openssl/base.h View File

@@ -67,8 +67,6 @@
#endif

#if defined(__cplusplus)
#include <memory>

extern "C" {
#endif

@@ -292,44 +290,6 @@ typedef void *OPENSSL_BLOCK;

#if defined(__cplusplus)
} /* extern C */

namespace bssl {

template<typename T, void (*func)(T*)>
struct Deleter {
void operator()(T *obj) {
func(obj);
}
};

template<typename T, void (*func)(T*)>
using ScopedType = std::unique_ptr<T, Deleter<T, func>>;

template<typename T, typename CleanupRet, void (*init_func)(T*),
CleanupRet (*cleanup_func)(T*)>
class ScopedContext {
public:
ScopedContext() {
init_func(&ctx_);
}
~ScopedContext() {
cleanup_func(&ctx_);
}

T *get() { return &ctx_; }
const T *get() const { return &ctx_; }

void Reset() {
cleanup_func(&ctx_);
init_func(&ctx_);
}

private:
T ctx_;
};

} // namespace bssl

#endif

#endif /* OPENSSL_HEADER_BASE_H */

+ 0
- 12
include/openssl/mem.h View File

@@ -133,18 +133,6 @@ OPENSSL_EXPORT int BIO_vsnprintf(char *buf, size_t n, const char *format,

#if defined(__cplusplus)
} /* extern C */

namespace bssl {

template<typename T>
struct Free {
void operator()(T *buf) {
OPENSSL_free(buf);
}
};

} // namespace bssl

#endif

#endif /* OPENSSL_HEADER_MEM_H */

+ 0
- 16
include/openssl/stack.h View File

@@ -290,22 +290,6 @@ OPENSSL_EXPORT _STACK *sk_deep_copy(const _STACK *sk,

#if defined(__cplusplus)
} /* extern C */

namespace bssl {

template<typename StackType, typename T, void (*func)(T*)>
struct StackDeleter {
void operator()(StackType *obj) {
sk_pop_free(reinterpret_cast<_STACK*>(obj),
reinterpret_cast<void (*)(void *)>(func));
}
};

template <typename StackType, typename T, void (*func)(T *)>
using ScopedStack =
std::unique_ptr<StackType, StackDeleter<StackType, T, func>>;

} // namespace bssl
#endif

#endif /* OPENSSL_HEADER_STACK_H */

+ 207
- 215
ssl/ssl_test.cc View File

@@ -33,190 +33,6 @@
#include "../crypto/test/test_util.h"


// kOpenSSLSession is a serialized SSL_SESSION generated from openssl
// s_client -sess_out.
static const char kOpenSSLSession[] =
"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"
"i4gv7Y5oliyn";

// kCustomSession is a custom serialized SSL_SESSION generated by
// filling in missing fields from |kOpenSSLSession|. This includes
// providing |peer_sha256|, so |peer| is not serialized.
static const char kCustomSession[] =
"MIIBdgIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
"kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
"IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
"BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
"LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
"CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
"q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
"BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBLADBAEF";

// kBoringSSLSession is a serialized SSL_SESSION generated from bssl client.
static const char kBoringSSLSession[] =
"MIIRwQIBAQICAwMEAsAvBCDdoGxGK26mR+8lM0uq6+k9xYuxPnwAjpcF9n0Yli9R"
"kQQwbyshfWhdi5XQ1++7n2L1qqrcVlmHBPpr6yknT/u4pUrpQB5FZ7vqvNn8MdHf"
"9rWgoQYCBFXgs7uiBAICHCCjggR6MIIEdjCCA16gAwIBAgIIf+yfD7Y6UicwDQYJ"
"KoZIhvcNAQELBQAwSTELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMx"
"JTAjBgNVBAMTHEdvb2dsZSBJbnRlcm5ldCBBdXRob3JpdHkgRzIwHhcNMTUwODEy"
"MTQ1MzE1WhcNMTUxMTEwMDAwMDAwWjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwK"
"Q2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzETMBEGA1UECgwKR29v"
"Z2xlIEluYzEXMBUGA1UEAwwOd3d3Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEB"
"AQUAA4IBDwAwggEKAoIBAQC0MeG5YGQ0t+IeJeoneP/PrhEaieibeKYkbKVLNZpo"
"PLuBinvhkXZo3DC133NpCBpy6ZktBwamqyixAyuk/NU6OjgXqwwxfQ7di1AInLIU"
"792c7hFyNXSUCG7At8Ifi3YwBX9Ba6u/1d6rWTGZJrdCq3QU11RkKYyTq2KT5mce"
"Tv9iGKqSkSTlp8puy/9SZ/3DbU3U+BuqCFqeSlz7zjwFmk35acdCilpJlVDDN5C/"
"RCh8/UKc8PaL+cxlt531qoTENvYrflBno14YEZlCBZsPiFeUSILpKEj3Ccwhy0eL"
"EucWQ72YZU8mUzXBoXGn0zA0crFl5ci/2sTBBGZsylNBAgMBAAGjggFBMIIBPTAd"
"BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdv"
"b2dsZS5jb20waAYIKwYBBQUHAQEEXDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtp"
"Lmdvb2dsZS5jb20vR0lBRzIuY3J0MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50"
"czEuZ29vZ2xlLmNvbS9vY3NwMB0GA1UdDgQWBBS/bzHxcE73Q4j3slC4BLbMtLjG"
"GjAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEv"
"MBcGA1UdIAQQMA4wDAYKKwYBBAHWeQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRw"
"Oi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQAb"
"qdWPZEHk0X7iKPCTHL6S3w6q1eR67goxZGFSM1lk1hjwyu7XcLJuvALVV9uY3ovE"
"kQZSHwT+pyOPWQhsSjO+1GyjvCvK/CAwiUmBX+bQRGaqHsRcio7xSbdVcajQ3bXd"
"X+s0WdbOpn6MStKAiBVloPlSxEI8pxY6x/BBCnTIk/+DMB17uZlOjG3vbAnkDkP+"
"n0OTucD9sHV7EVj9XUxi51nOfNBCN/s7lpUjDS/NJ4k3iwOtbCPswiot8vLO779a"
"f07vR03r349Iz/KTzk95rlFtX0IU+KYNxFNsanIXZ+C9FYGRXkwhHcvFb4qMUB1y"
"TTlM80jBMOwyjZXmjRAhpAIEAKUDAgEUqQUCAwGJwKqBpwSBpOgebbmn9NRUtMWH"
"+eJpqA5JLMFSMCChOsvKey3toBaCNGU7HfAEiiXNuuAdCBoK262BjQc2YYfqFzqH"
"zuppopXCvhohx7j/tnCNZIMgLYt/O9SXK2RYI5z8FhCCHvB4CbD5G0LGl5EFP27s"
"Jb6S3aTTYPkQe8yZSlxevg6NDwmTogLO9F7UUkaYmVcMQhzssEE2ZRYNwSOU6KjE"
"0Yj+8fAiBtbQriIEIN2L8ZlpaVrdN5KFNdvcmOxJu81P8q53X55xQyGTnGWwsgMC"
"ARezggvvMIIEdjCCA16gAwIBAgIIf+yfD7Y6UicwDQYJKoZIhvcNAQELBQAwSTEL"
"MAkGA1UEBhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2ds"
"ZSBJbnRlcm5ldCBBdXRob3JpdHkgRzIwHhcNMTUwODEyMTQ1MzE1WhcNMTUxMTEw"
"MDAwMDAwWjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQG"
"A1UEBwwNTW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEXMBUGA1UE"
"AwwOd3d3Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB"
"AQC0MeG5YGQ0t+IeJeoneP/PrhEaieibeKYkbKVLNZpoPLuBinvhkXZo3DC133Np"
"CBpy6ZktBwamqyixAyuk/NU6OjgXqwwxfQ7di1AInLIU792c7hFyNXSUCG7At8If"
"i3YwBX9Ba6u/1d6rWTGZJrdCq3QU11RkKYyTq2KT5mceTv9iGKqSkSTlp8puy/9S"
"Z/3DbU3U+BuqCFqeSlz7zjwFmk35acdCilpJlVDDN5C/RCh8/UKc8PaL+cxlt531"
"qoTENvYrflBno14YEZlCBZsPiFeUSILpKEj3Ccwhy0eLEucWQ72YZU8mUzXBoXGn"
"0zA0crFl5ci/2sTBBGZsylNBAgMBAAGjggFBMIIBPTAdBgNVHSUEFjAUBggrBgEF"
"BQcDAQYIKwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdvb2dsZS5jb20waAYIKwYB"
"BQUHAQEEXDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lB"
"RzIuY3J0MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9v"
"Y3NwMB0GA1UdDgQWBBS/bzHxcE73Q4j3slC4BLbMtLjGGjAMBgNVHRMBAf8EAjAA"
"MB8GA1UdIwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMBcGA1UdIAQQMA4wDAYK"
"KwYBBAHWeQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRwOi8vcGtpLmdvb2dsZS5j"
"b20vR0lBRzIuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQAbqdWPZEHk0X7iKPCTHL6S"
"3w6q1eR67goxZGFSM1lk1hjwyu7XcLJuvALVV9uY3ovEkQZSHwT+pyOPWQhsSjO+"
"1GyjvCvK/CAwiUmBX+bQRGaqHsRcio7xSbdVcajQ3bXdX+s0WdbOpn6MStKAiBVl"
"oPlSxEI8pxY6x/BBCnTIk/+DMB17uZlOjG3vbAnkDkP+n0OTucD9sHV7EVj9XUxi"
"51nOfNBCN/s7lpUjDS/NJ4k3iwOtbCPswiot8vLO779af07vR03r349Iz/KTzk95"
"rlFtX0IU+KYNxFNsanIXZ+C9FYGRXkwhHcvFb4qMUB1yTTlM80jBMOwyjZXmjRAh"
"MIID8DCCAtigAwIBAgIDAjqDMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT"
"MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i"
"YWwgQ0EwHhcNMTMwNDA1MTUxNTU2WhcNMTYxMjMxMjM1OTU5WjBJMQswCQYDVQQG"
"EwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzElMCMGA1UEAxMcR29vZ2xlIEludGVy"
"bmV0IEF1dGhvcml0eSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB"
"AJwqBHdc2FCROgajguDYUEi8iT/xGXAaiEZ+4I/F8YnOIe5a/mENtzJEiaB0C1NP"
"VaTOgmKV7utZX8bhBYASxF6UP7xbSDj0U/ck5vuR6RXEz/RTDfRK/J9U3n2+oGtv"
"h8DQUB8oMANA2ghzUWx//zo8pzcGjr1LEQTrfSTe5vn8MXH7lNVg8y5Kr0LSy+rE"
"ahqyzFPdFUuLH8gZYR/Nnag+YyuENWllhMgZxUYi+FOVvuOAShDGKuy6lyARxzmZ"
"EASg8GF6lSWMTlJ14rbtCMoU/M4iarNOz0YDl5cDfsCx3nuvRTPPuj5xt970JSXC"
"DTWJnZ37DhF5iR43xa+OcmkCAwEAAaOB5zCB5DAfBgNVHSMEGDAWgBTAephojYn7"
"qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUSt0GFhu89mi1dvWBtrtiGrpagS8wDgYD"
"VR0PAQH/BAQDAgEGMC4GCCsGAQUFBwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDov"
"L2cuc3ltY2QuY29tMBIGA1UdEwEB/wQIMAYBAf8CAQAwNQYDVR0fBC4wLDAqoCig"
"JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMBcGA1UdIAQQ"
"MA4wDAYKKwYBBAHWeQIFATANBgkqhkiG9w0BAQsFAAOCAQEAqvqpIM1qZ4PtXtR+"
"3h3Ef+AlBgDFJPupyC1tft6dgmUsgWM0Zj7pUsIItMsv91+ZOmqcUHqFBYx90SpI"
"hNMJbHzCzTWf84LuUt5oX+QAihcglvcpjZpNy6jehsgNb1aHA30DP9z6eX0hGfnI"
"Oi9RdozHQZJxjyXON/hKTAAj78Q1EK7gI4BzfE00LshukNYQHpmEcxpw8u1VDu4X"
"Bupn7jLrLN1nBz/2i8Jw3lsA5rsb0zYaImxssDVCbJAJPZPpZAkiDoUGn8JzIdPm"
"X4DkjYUiOnMDsWCOrmji9D6X52ASCWg23jrW4kOVWzeBkoEfu43XrVJkFleW2V40"
"fsg12DCCA30wggLmoAMCAQICAxK75jANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG"
"EwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUg"
"Q2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTAyMDUyMTA0MDAwMFoXDTE4MDgyMTA0"
"MDAwMFowQjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xGzAZ"
"BgNVBAMTEkdlb1RydXN0IEdsb2JhbCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP"
"ADCCAQoCggEBANrMGGMw/fQXIxpWflvfPGw45HG3eJHUvKHYTPioQ7YD6U0hBwiI"
"2lgvZjkpvQV4i5046AW3an5xpObEYKaw74DkiSgPniXW7YPzraaRx5jJQhg1FJ2t"
"mEaSLk/K8YdDwRaVVy1Q74ktgHpXrfLuX2vSAI25FPgUFTXZwEaje3LIkb/JVSvN"
"0Jc+nCZkzN/Ogxlxyk7m1NV7qRnNVd7I7NJeOFPlXE+MLf5QIzb8ZubLjqQ5GQC3"
"lQI5kQsO/jgu0R0FmvZNPm8PBx2vLB6PYDni+jZTEznUXiYr2z2oFL0y6xgDKFIE"
"ceWrMz3hOLsHNoRinHnqFjD0X8Ar6HFr5PkCAwEAAaOB8DCB7TAfBgNVHSMEGDAW"
"gBRI5mj5K9KylddH2CMgEE8zmJCf1DAdBgNVHQ4EFgQUwHqYaI2J+6sFZAwRfap9"
"ZbjKzE4wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwOgYDVR0fBDMw"
"MTAvoC2gK4YpaHR0cDovL2NybC5nZW90cnVzdC5jb20vY3Jscy9zZWN1cmVjYS5j"
"cmwwTgYDVR0gBEcwRTBDBgRVHSAAMDswOQYIKwYBBQUHAgEWLWh0dHBzOi8vd3d3"
"Lmdlb3RydXN0LmNvbS9yZXNvdXJjZXMvcmVwb3NpdG9yeTANBgkqhkiG9w0BAQUF"
"AAOBgQB24RJuTksWEoYwBrKBCM/wCMfHcX5m7sLt1Dsf//DwyE7WQziwuTB9GNBV"
"g6JqyzYRnOhIZqNtf7gT1Ef+i1pcc/yu2RsyGTirlzQUqpbS66McFAhJtrvlke+D"
"NusdVm/K2rxzY5Dkf3s+Iss9B+1fOHSc4wNQTqGvmO5h8oQ/Eg==";

// kBadSessionExtraField is a custom serialized SSL_SESSION generated by replacing
// the final (optional) element of |kCustomSession| with tag number 30.
static const char kBadSessionExtraField[] =
"MIIBdgIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
"kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
"IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
"BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
"LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
"CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
"q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
"BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBL4DBAEF";

// kBadSessionVersion is a custom serialized SSL_SESSION generated by replacing
// the version of |kCustomSession| with 2.
static const char kBadSessionVersion[] =
"MIIBdgIBAgICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
"kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
"IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
"BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
"LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
"CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
"q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
"BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBLADBAEF";

// kBadSessionTrailingData is a custom serialized SSL_SESSION with trailing data
// appended.
static const char kBadSessionTrailingData[] =
"MIIBdgIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
"kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
"IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
"BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
"LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
"CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
"q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
"BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBLADBAEFAAAA";

namespace bssl {

struct ExpectedCipher {
unsigned long id;
int in_group_flag;
@@ -585,6 +401,188 @@ static bool TestCipherRules() {
return true;
}

// kOpenSSLSession is a serialized SSL_SESSION generated from openssl
// s_client -sess_out.
static const char kOpenSSLSession[] =
"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"
"i4gv7Y5oliyn";

// kCustomSession is a custom serialized SSL_SESSION generated by
// filling in missing fields from |kOpenSSLSession|. This includes
// providing |peer_sha256|, so |peer| is not serialized.
static const char kCustomSession[] =
"MIIBdgIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
"kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
"IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
"BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
"LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
"CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
"q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
"BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBLADBAEF";

// kBoringSSLSession is a serialized SSL_SESSION generated from bssl client.
static const char kBoringSSLSession[] =
"MIIRwQIBAQICAwMEAsAvBCDdoGxGK26mR+8lM0uq6+k9xYuxPnwAjpcF9n0Yli9R"
"kQQwbyshfWhdi5XQ1++7n2L1qqrcVlmHBPpr6yknT/u4pUrpQB5FZ7vqvNn8MdHf"
"9rWgoQYCBFXgs7uiBAICHCCjggR6MIIEdjCCA16gAwIBAgIIf+yfD7Y6UicwDQYJ"
"KoZIhvcNAQELBQAwSTELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMx"
"JTAjBgNVBAMTHEdvb2dsZSBJbnRlcm5ldCBBdXRob3JpdHkgRzIwHhcNMTUwODEy"
"MTQ1MzE1WhcNMTUxMTEwMDAwMDAwWjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwK"
"Q2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzETMBEGA1UECgwKR29v"
"Z2xlIEluYzEXMBUGA1UEAwwOd3d3Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEB"
"AQUAA4IBDwAwggEKAoIBAQC0MeG5YGQ0t+IeJeoneP/PrhEaieibeKYkbKVLNZpo"
"PLuBinvhkXZo3DC133NpCBpy6ZktBwamqyixAyuk/NU6OjgXqwwxfQ7di1AInLIU"
"792c7hFyNXSUCG7At8Ifi3YwBX9Ba6u/1d6rWTGZJrdCq3QU11RkKYyTq2KT5mce"
"Tv9iGKqSkSTlp8puy/9SZ/3DbU3U+BuqCFqeSlz7zjwFmk35acdCilpJlVDDN5C/"
"RCh8/UKc8PaL+cxlt531qoTENvYrflBno14YEZlCBZsPiFeUSILpKEj3Ccwhy0eL"
"EucWQ72YZU8mUzXBoXGn0zA0crFl5ci/2sTBBGZsylNBAgMBAAGjggFBMIIBPTAd"
"BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdv"
"b2dsZS5jb20waAYIKwYBBQUHAQEEXDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtp"
"Lmdvb2dsZS5jb20vR0lBRzIuY3J0MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50"
"czEuZ29vZ2xlLmNvbS9vY3NwMB0GA1UdDgQWBBS/bzHxcE73Q4j3slC4BLbMtLjG"
"GjAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEv"
"MBcGA1UdIAQQMA4wDAYKKwYBBAHWeQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRw"
"Oi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQAb"
"qdWPZEHk0X7iKPCTHL6S3w6q1eR67goxZGFSM1lk1hjwyu7XcLJuvALVV9uY3ovE"
"kQZSHwT+pyOPWQhsSjO+1GyjvCvK/CAwiUmBX+bQRGaqHsRcio7xSbdVcajQ3bXd"
"X+s0WdbOpn6MStKAiBVloPlSxEI8pxY6x/BBCnTIk/+DMB17uZlOjG3vbAnkDkP+"
"n0OTucD9sHV7EVj9XUxi51nOfNBCN/s7lpUjDS/NJ4k3iwOtbCPswiot8vLO779a"
"f07vR03r349Iz/KTzk95rlFtX0IU+KYNxFNsanIXZ+C9FYGRXkwhHcvFb4qMUB1y"
"TTlM80jBMOwyjZXmjRAhpAIEAKUDAgEUqQUCAwGJwKqBpwSBpOgebbmn9NRUtMWH"
"+eJpqA5JLMFSMCChOsvKey3toBaCNGU7HfAEiiXNuuAdCBoK262BjQc2YYfqFzqH"
"zuppopXCvhohx7j/tnCNZIMgLYt/O9SXK2RYI5z8FhCCHvB4CbD5G0LGl5EFP27s"
"Jb6S3aTTYPkQe8yZSlxevg6NDwmTogLO9F7UUkaYmVcMQhzssEE2ZRYNwSOU6KjE"
"0Yj+8fAiBtbQriIEIN2L8ZlpaVrdN5KFNdvcmOxJu81P8q53X55xQyGTnGWwsgMC"
"ARezggvvMIIEdjCCA16gAwIBAgIIf+yfD7Y6UicwDQYJKoZIhvcNAQELBQAwSTEL"
"MAkGA1UEBhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2ds"
"ZSBJbnRlcm5ldCBBdXRob3JpdHkgRzIwHhcNMTUwODEyMTQ1MzE1WhcNMTUxMTEw"
"MDAwMDAwWjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQG"
"A1UEBwwNTW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEXMBUGA1UE"
"AwwOd3d3Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB"
"AQC0MeG5YGQ0t+IeJeoneP/PrhEaieibeKYkbKVLNZpoPLuBinvhkXZo3DC133Np"
"CBpy6ZktBwamqyixAyuk/NU6OjgXqwwxfQ7di1AInLIU792c7hFyNXSUCG7At8If"
"i3YwBX9Ba6u/1d6rWTGZJrdCq3QU11RkKYyTq2KT5mceTv9iGKqSkSTlp8puy/9S"
"Z/3DbU3U+BuqCFqeSlz7zjwFmk35acdCilpJlVDDN5C/RCh8/UKc8PaL+cxlt531"
"qoTENvYrflBno14YEZlCBZsPiFeUSILpKEj3Ccwhy0eLEucWQ72YZU8mUzXBoXGn"
"0zA0crFl5ci/2sTBBGZsylNBAgMBAAGjggFBMIIBPTAdBgNVHSUEFjAUBggrBgEF"
"BQcDAQYIKwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdvb2dsZS5jb20waAYIKwYB"
"BQUHAQEEXDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lB"
"RzIuY3J0MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9v"
"Y3NwMB0GA1UdDgQWBBS/bzHxcE73Q4j3slC4BLbMtLjGGjAMBgNVHRMBAf8EAjAA"
"MB8GA1UdIwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMBcGA1UdIAQQMA4wDAYK"
"KwYBBAHWeQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRwOi8vcGtpLmdvb2dsZS5j"
"b20vR0lBRzIuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQAbqdWPZEHk0X7iKPCTHL6S"
"3w6q1eR67goxZGFSM1lk1hjwyu7XcLJuvALVV9uY3ovEkQZSHwT+pyOPWQhsSjO+"
"1GyjvCvK/CAwiUmBX+bQRGaqHsRcio7xSbdVcajQ3bXdX+s0WdbOpn6MStKAiBVl"
"oPlSxEI8pxY6x/BBCnTIk/+DMB17uZlOjG3vbAnkDkP+n0OTucD9sHV7EVj9XUxi"
"51nOfNBCN/s7lpUjDS/NJ4k3iwOtbCPswiot8vLO779af07vR03r349Iz/KTzk95"
"rlFtX0IU+KYNxFNsanIXZ+C9FYGRXkwhHcvFb4qMUB1yTTlM80jBMOwyjZXmjRAh"
"MIID8DCCAtigAwIBAgIDAjqDMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT"
"MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i"
"YWwgQ0EwHhcNMTMwNDA1MTUxNTU2WhcNMTYxMjMxMjM1OTU5WjBJMQswCQYDVQQG"
"EwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzElMCMGA1UEAxMcR29vZ2xlIEludGVy"
"bmV0IEF1dGhvcml0eSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB"
"AJwqBHdc2FCROgajguDYUEi8iT/xGXAaiEZ+4I/F8YnOIe5a/mENtzJEiaB0C1NP"
"VaTOgmKV7utZX8bhBYASxF6UP7xbSDj0U/ck5vuR6RXEz/RTDfRK/J9U3n2+oGtv"
"h8DQUB8oMANA2ghzUWx//zo8pzcGjr1LEQTrfSTe5vn8MXH7lNVg8y5Kr0LSy+rE"
"ahqyzFPdFUuLH8gZYR/Nnag+YyuENWllhMgZxUYi+FOVvuOAShDGKuy6lyARxzmZ"
"EASg8GF6lSWMTlJ14rbtCMoU/M4iarNOz0YDl5cDfsCx3nuvRTPPuj5xt970JSXC"
"DTWJnZ37DhF5iR43xa+OcmkCAwEAAaOB5zCB5DAfBgNVHSMEGDAWgBTAephojYn7"
"qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUSt0GFhu89mi1dvWBtrtiGrpagS8wDgYD"
"VR0PAQH/BAQDAgEGMC4GCCsGAQUFBwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDov"
"L2cuc3ltY2QuY29tMBIGA1UdEwEB/wQIMAYBAf8CAQAwNQYDVR0fBC4wLDAqoCig"
"JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMBcGA1UdIAQQ"
"MA4wDAYKKwYBBAHWeQIFATANBgkqhkiG9w0BAQsFAAOCAQEAqvqpIM1qZ4PtXtR+"
"3h3Ef+AlBgDFJPupyC1tft6dgmUsgWM0Zj7pUsIItMsv91+ZOmqcUHqFBYx90SpI"
"hNMJbHzCzTWf84LuUt5oX+QAihcglvcpjZpNy6jehsgNb1aHA30DP9z6eX0hGfnI"
"Oi9RdozHQZJxjyXON/hKTAAj78Q1EK7gI4BzfE00LshukNYQHpmEcxpw8u1VDu4X"
"Bupn7jLrLN1nBz/2i8Jw3lsA5rsb0zYaImxssDVCbJAJPZPpZAkiDoUGn8JzIdPm"
"X4DkjYUiOnMDsWCOrmji9D6X52ASCWg23jrW4kOVWzeBkoEfu43XrVJkFleW2V40"
"fsg12DCCA30wggLmoAMCAQICAxK75jANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG"
"EwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUg"
"Q2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTAyMDUyMTA0MDAwMFoXDTE4MDgyMTA0"
"MDAwMFowQjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xGzAZ"
"BgNVBAMTEkdlb1RydXN0IEdsb2JhbCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP"
"ADCCAQoCggEBANrMGGMw/fQXIxpWflvfPGw45HG3eJHUvKHYTPioQ7YD6U0hBwiI"
"2lgvZjkpvQV4i5046AW3an5xpObEYKaw74DkiSgPniXW7YPzraaRx5jJQhg1FJ2t"
"mEaSLk/K8YdDwRaVVy1Q74ktgHpXrfLuX2vSAI25FPgUFTXZwEaje3LIkb/JVSvN"
"0Jc+nCZkzN/Ogxlxyk7m1NV7qRnNVd7I7NJeOFPlXE+MLf5QIzb8ZubLjqQ5GQC3"
"lQI5kQsO/jgu0R0FmvZNPm8PBx2vLB6PYDni+jZTEznUXiYr2z2oFL0y6xgDKFIE"
"ceWrMz3hOLsHNoRinHnqFjD0X8Ar6HFr5PkCAwEAAaOB8DCB7TAfBgNVHSMEGDAW"
"gBRI5mj5K9KylddH2CMgEE8zmJCf1DAdBgNVHQ4EFgQUwHqYaI2J+6sFZAwRfap9"
"ZbjKzE4wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwOgYDVR0fBDMw"
"MTAvoC2gK4YpaHR0cDovL2NybC5nZW90cnVzdC5jb20vY3Jscy9zZWN1cmVjYS5j"
"cmwwTgYDVR0gBEcwRTBDBgRVHSAAMDswOQYIKwYBBQUHAgEWLWh0dHBzOi8vd3d3"
"Lmdlb3RydXN0LmNvbS9yZXNvdXJjZXMvcmVwb3NpdG9yeTANBgkqhkiG9w0BAQUF"
"AAOBgQB24RJuTksWEoYwBrKBCM/wCMfHcX5m7sLt1Dsf//DwyE7WQziwuTB9GNBV"
"g6JqyzYRnOhIZqNtf7gT1Ef+i1pcc/yu2RsyGTirlzQUqpbS66McFAhJtrvlke+D"
"NusdVm/K2rxzY5Dkf3s+Iss9B+1fOHSc4wNQTqGvmO5h8oQ/Eg==";

// kBadSessionExtraField is a custom serialized SSL_SESSION generated by replacing
// the final (optional) element of |kCustomSession| with tag number 30.
static const char kBadSessionExtraField[] =
"MIIBdgIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
"kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
"IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
"BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
"LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
"CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
"q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
"BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBL4DBAEF";

// kBadSessionVersion is a custom serialized SSL_SESSION generated by replacing
// the version of |kCustomSession| with 2.
static const char kBadSessionVersion[] =
"MIIBdgIBAgICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
"kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
"IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
"BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
"LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
"CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
"q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
"BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBLADBAEF";

// kBadSessionTrailingData is a custom serialized SSL_SESSION with trailing data
// appended.
static const char kBadSessionTrailingData[] =
"MIIBdgIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
"kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
"IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
"BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
"LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
"CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
"q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
"BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBLADBAEFAAAA";

static bool DecodeBase64(std::vector<uint8_t> *out, const char *in) {
size_t len;
if (!EVP_DecodedLength(&len, strlen(in))) {
@@ -621,7 +619,7 @@ static bool TestSSL_SESSIONEncoding(const char *input_b64) {

// Verify the SSL_SESSION encoding round-trips.
size_t encoded_len;
ScopedBytes encoded;
ScopedOpenSSLBytes encoded;
uint8_t *encoded_raw;
if (!SSL_SESSION_to_bytes(session.get(), &encoded_raw, &encoded_len)) {
fprintf(stderr, "SSL_SESSION_to_bytes failed\n");
@@ -710,7 +708,7 @@ static bool CipherGetRFCName(std::string *out, uint16_t value) {
if (cipher == NULL) {
return false;
}
ScopedString rfc_name(SSL_CIPHER_get_rfc_name(cipher));
ScopedOpenSSLString rfc_name(SSL_CIPHER_get_rfc_name(cipher));
if (!rfc_name) {
return false;
}
@@ -1355,39 +1353,33 @@ static bool TestSetFD() {
return true;
}

} // namespace bssl

int main() {
CRYPTO_library_init();

if (!bssl::TestCipherRules() ||
!bssl::TestSSL_SESSIONEncoding(kOpenSSLSession) ||
!bssl::TestSSL_SESSIONEncoding(kCustomSession) ||
!bssl::TestSSL_SESSIONEncoding(kBoringSSLSession) ||
!bssl::TestBadSSL_SESSIONEncoding(kBadSessionExtraField) ||
!bssl::TestBadSSL_SESSIONEncoding(kBadSessionVersion) ||
!bssl::TestBadSSL_SESSIONEncoding(kBadSessionTrailingData) ||
if (!TestCipherRules() ||
!TestSSL_SESSIONEncoding(kOpenSSLSession) ||
!TestSSL_SESSIONEncoding(kCustomSession) ||
!TestSSL_SESSIONEncoding(kBoringSSLSession) ||
!TestBadSSL_SESSIONEncoding(kBadSessionExtraField) ||
!TestBadSSL_SESSIONEncoding(kBadSessionVersion) ||
!TestBadSSL_SESSIONEncoding(kBadSessionTrailingData) ||
// TODO(svaldez): Update this when TLS 1.3 is enabled by default.
!bssl::TestDefaultVersion(SSL3_VERSION, TLS1_2_VERSION, &TLS_method) ||
!bssl::TestDefaultVersion(SSL3_VERSION, SSL3_VERSION, &SSLv3_method) ||
!bssl::TestDefaultVersion(TLS1_VERSION, TLS1_VERSION, &TLSv1_method) ||
!bssl::TestDefaultVersion(TLS1_1_VERSION, TLS1_1_VERSION,
&TLSv1_1_method) ||
!bssl::TestDefaultVersion(TLS1_2_VERSION, TLS1_2_VERSION,
&TLSv1_2_method) ||
!bssl::TestDefaultVersion(TLS1_1_VERSION, TLS1_2_VERSION, &DTLS_method) ||
!bssl::TestDefaultVersion(TLS1_1_VERSION, TLS1_1_VERSION,
&DTLSv1_method) ||
!bssl::TestDefaultVersion(TLS1_2_VERSION, TLS1_2_VERSION,
&DTLSv1_2_method) ||
!bssl::TestCipherGetRFCName() ||
!bssl::TestPaddingExtension() ||
!bssl::TestClientCAList() ||
!bssl::TestInternalSessionCache() ||
!bssl::TestSequenceNumber(false /* TLS */) ||
!bssl::TestSequenceNumber(true /* DTLS */) ||
!bssl::TestOneSidedShutdown() ||
!bssl::TestSetFD()) {
!TestDefaultVersion(SSL3_VERSION, TLS1_2_VERSION, &TLS_method) ||
!TestDefaultVersion(SSL3_VERSION, SSL3_VERSION, &SSLv3_method) ||
!TestDefaultVersion(TLS1_VERSION, TLS1_VERSION, &TLSv1_method) ||
!TestDefaultVersion(TLS1_1_VERSION, TLS1_1_VERSION, &TLSv1_1_method) ||
!TestDefaultVersion(TLS1_2_VERSION, TLS1_2_VERSION, &TLSv1_2_method) ||
!TestDefaultVersion(TLS1_1_VERSION, TLS1_2_VERSION, &DTLS_method) ||
!TestDefaultVersion(TLS1_1_VERSION, TLS1_1_VERSION, &DTLSv1_method) ||
!TestDefaultVersion(TLS1_2_VERSION, TLS1_2_VERSION, &DTLSv1_2_method) ||
!TestCipherGetRFCName() ||
!TestPaddingExtension() ||
!TestClientCAList() ||
!TestInternalSessionCache() ||
!TestSequenceNumber(false /* TLS */) ||
!TestSequenceNumber(true /* DTLS */) ||
!TestOneSidedShutdown() ||
!TestSetFD()) {
ERR_print_errors_fp(stderr);
return 1;
}


+ 0
- 4
ssl/test/async_bio.cc View File

@@ -20,8 +20,6 @@
#include <openssl/mem.h>


namespace bssl {

namespace {

extern const BIO_METHOD g_async_bio_method;
@@ -188,5 +186,3 @@ void AsyncBioEnforceWriteQuota(BIO *bio, bool enforce) {
}
a->enforce_write_quota = enforce;
}

} // namespace bssl

+ 0
- 4
ssl/test/async_bio.h View File

@@ -20,8 +20,6 @@
#include "../../crypto/test/scoped_types.h"


namespace bssl {

// AsyncBioCreate creates a filter BIO for testing asynchronous state
// machines which consume a stream socket. Reads and writes will fail
// and return EAGAIN unless explicitly allowed. Each async BIO has a
@@ -43,7 +41,5 @@ void AsyncBioAllowWrite(BIO *bio, size_t count);
// AsyncBioEnforceWriteQuota configures where |bio| enforces its write quota.
void AsyncBioEnforceWriteQuota(BIO *bio, bool enforce);

} // namespace bssl


#endif // HEADER_ASYNC_BIO

+ 3
- 11
ssl/test/bssl_shim.cc View File

@@ -62,8 +62,6 @@ OPENSSL_MSVC_PRAGMA(warning(pop))
#include "test_config.h"


namespace bssl {

#if !defined(OPENSSL_WINDOWS)
static int closesocket(int sock) {
return close(sock);
@@ -286,7 +284,7 @@ static const SSL_PRIVATE_KEY_METHOD g_async_private_key_method = {
};

template<typename T>
struct SystemFree {
struct Free {
void operator()(T *buf) {
free(buf);
}
@@ -297,7 +295,7 @@ static bool GetCertificate(SSL *ssl, ScopedX509 *out_x509,
const TestConfig *config = GetTestConfig(ssl);

if (!config->digest_prefs.empty()) {
std::unique_ptr<char, SystemFree<char>> digest_prefs(
std::unique_ptr<char, Free<char>> digest_prefs(
strdup(config->digest_prefs.c_str()));
std::vector<int> digest_list;

@@ -1557,7 +1555,7 @@ class StderrDelimiter {
~StderrDelimiter() { fprintf(stderr, "--- DONE ---\n"); }
};

static int Main(int argc, char **argv) {
int main(int argc, char **argv) {
// To distinguish ASan's output from ours, add a trailing message to stderr.
// Anything following this line will be considered an error.
StderrDelimiter delimiter;
@@ -1613,9 +1611,3 @@ static int Main(int argc, char **argv) {

return 0;
}

} // namespace bssl

int main(int argc, char **argv) {
return bssl::Main(argc, argv);
}

+ 0
- 4
ssl/test/packeted_bio.cc View File

@@ -22,8 +22,6 @@
#include <openssl/mem.h>


namespace bssl {

namespace {

extern const BIO_METHOD g_packeted_bio_method;
@@ -304,5 +302,3 @@ bool PacketedBioAdvanceClock(BIO *bio) {
memset(&data->timeout, 0, sizeof(data->timeout));
return true;
}

} // namespace bssl

+ 0
- 4
ssl/test/packeted_bio.h View File

@@ -29,8 +29,6 @@ OPENSSL_MSVC_PRAGMA(warning(pop))
#endif


namespace bssl {

// PacketedBioCreate creates a filter BIO which implements a reliable in-order
// blocking datagram socket. It internally maintains a clock and honors
// |BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT| based on it.
@@ -49,7 +47,5 @@ timeval PacketedBioGetClock(const BIO *bio);
// there is a pending timeout. Otherwise, it returns false.
bool PacketedBioAdvanceClock(BIO *bio);

} // namespace bssl


#endif // HEADER_PACKETED_BIO

+ 3
- 7
ssl/test/scoped_types.h View File

@@ -20,13 +20,9 @@
#include "../../crypto/test/scoped_types.h"


namespace bssl {

using ScopedSSL = ScopedType<SSL, SSL_free>;
using ScopedSSL_CTX = ScopedType<SSL_CTX, SSL_CTX_free>;
using ScopedSSL_SESSION = ScopedType<SSL_SESSION, SSL_SESSION_free>;

} // namespace bssl
using ScopedSSL = ScopedOpenSSLType<SSL, SSL_free>;
using ScopedSSL_CTX = ScopedOpenSSLType<SSL_CTX, SSL_CTX_free>;
using ScopedSSL_SESSION = ScopedOpenSSLType<SSL_SESSION, SSL_SESSION_free>;


#endif // OPENSSL_HEADER_SSL_TEST_SCOPED_TYPES_H

+ 0
- 4
ssl/test/test_config.cc View File

@@ -22,8 +22,6 @@

#include <openssl/base64.h>

namespace bssl {

namespace {

template <typename T>
@@ -215,5 +213,3 @@ bool ParseConfig(int argc, char **argv, TestConfig *out_config) {

return true;
}

} // namespace bssl

+ 0
- 4
ssl/test/test_config.h View File

@@ -18,8 +18,6 @@
#include <string>


namespace bssl {

struct TestConfig {
int port = 0;
bool is_server = false;
@@ -113,7 +111,5 @@ struct TestConfig {

bool ParseConfig(int argc, char **argv, TestConfig *out_config);

} // namespace bssl


#endif // HEADER_TEST_CONFIG

+ 0
- 4
tool/args.cc View File

@@ -23,8 +23,6 @@
#include "internal.h"


namespace bssl {

bool ParseKeyValueArguments(std::map<std::string, std::string> *out_args,
const std::vector<std::string> &args,
const struct argument *templates) {
@@ -104,5 +102,3 @@ bool GetUnsigned(unsigned *out, const std::string &arg_name,
*out = num;
return true;
}

} // namespace bssl

+ 0
- 4
tool/ciphers.cc View File

@@ -25,8 +25,6 @@
#include "internal.h"


namespace bssl {

bool Ciphers(const std::vector<std::string> &args) {
if (args.size() != 1) {
fprintf(stderr, "Usage: bssl ciphers <cipher suite string>\n");
@@ -66,5 +64,3 @@ bool Ciphers(const std::vector<std::string> &args) {

return true;
}

} // namespace bssl

+ 0
- 4
tool/client.cc View File

@@ -26,8 +26,6 @@
#include "transport_common.h"


namespace bssl {

static const struct argument kArguments[] = {
{
"-connect", kRequiredArgument,
@@ -328,5 +326,3 @@ bool Client(const std::vector<std::string> &args) {

return ok;
}

} // namespace bssl

+ 0
- 4
tool/const.cc View File

@@ -18,8 +18,6 @@
#include "internal.h"


namespace bssl {

const uint8_t kDERRSAPrivate2048[] = {
0x30, 0x82, 0x04, 0xa3, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00,
0xd0, 0x02, 0xde, 0x5d, 0x19, 0x33, 0x48, 0x15, 0xc7, 0x86, 0xde, 0xa3,
@@ -434,5 +432,3 @@ const uint8_t kDERRSAPrivate3Prime2048[] = {
};

const size_t kDERRSAPrivate3Prime2048Len = sizeof(kDERRSAPrivate3Prime2048);

} // namespace bssl

+ 0
- 4
tool/digest.cc View File

@@ -44,8 +44,6 @@ typedef int ssize_t;
#include "internal.h"


namespace bssl {

struct close_delete {
void operator()(int *fd) {
BORINGSSL_CLOSE(*fd);
@@ -478,5 +476,3 @@ bool SHA384Sum(const std::vector<std::string> &args) {
bool SHA512Sum(const std::vector<std::string> &args) {
return DigestSum(EVP_sha512(), args);
}

} // namespace bssl

+ 0
- 4
tool/generate_ed25519.cc View File

@@ -22,8 +22,6 @@
#include "internal.h"


namespace bssl {

static const struct argument kArguments[] = {
{
"-out-public", kRequiredArgument, "The file to write the public key to",
@@ -67,5 +65,3 @@ bool GenerateEd25519Key(const std::vector<std::string> &args) {
WriteToFile(args_map["-out-private"], private_key,
sizeof(private_key));
}

} // namespace bssl

+ 0
- 4
tool/genrsa.cc View File

@@ -22,8 +22,6 @@
#include "internal.h"


namespace bssl {

static const struct argument kArguments[] = {
{
"-nprimes", kOptionalArgument,
@@ -69,5 +67,3 @@ bool GenerateRSAKey(const std::vector<std::string> &args) {

return true;
}

} // namespace bssl

+ 0
- 4
tool/internal.h View File

@@ -44,8 +44,6 @@ OPENSSL_MSVC_PRAGMA(warning(pop))
#define BORINGSSL_WRITE write
#endif

namespace bssl {

enum ArgumentType {
kRequiredArgument,
kOptionalArgument,
@@ -90,7 +88,5 @@ extern const size_t kDERRSAPrivate4096Len;
extern const uint8_t kDERRSAPrivate3Prime2048[];
extern const size_t kDERRSAPrivate3Prime2048Len;

} // namespace bssl


#endif /* !OPENSSL_HEADER_TOOL_INTERNAL_H */

+ 0
- 4
tool/pkcs12.cc View File

@@ -39,8 +39,6 @@
#include "internal.h"


namespace bssl {

#if defined(OPENSSL_WINDOWS)
typedef int read_result_t;
#else
@@ -142,5 +140,3 @@ bool DoPKCS12(const std::vector<std::string> &args) {

return true;
}

} // namespace bssl

+ 0
- 4
tool/rand.cc View File

@@ -23,8 +23,6 @@
#include "internal.h"


namespace bssl {

static const struct argument kArguments[] = {
{
"-hex", kBooleanArgument,
@@ -95,5 +93,3 @@ bool Rand(const std::vector<std::string> &args) {

return true;
}

} // namespace bssl

+ 0
- 4
tool/server.cc View File

@@ -21,8 +21,6 @@
#include "transport_common.h"


namespace bssl {

static const struct argument kArguments[] = {
{
"-accept", kRequiredArgument,
@@ -152,5 +150,3 @@ bool Server(const std::vector<std::string> &args) {
SSL_CTX_free(ctx);
return ok;
}

} // namespace bssl

+ 0
- 4
tool/speed.cc View File

@@ -41,8 +41,6 @@ OPENSSL_MSVC_PRAGMA(warning(pop))
#include "internal.h"


namespace bssl {

// TimeResults represents the results of benchmarking a function.
struct TimeResults {
// num_calls is the number of function calls done in the time period.
@@ -632,5 +630,3 @@ bool Speed(const std::vector<std::string> &args) {

return true;
}

} // namespace bssl

+ 1
- 10
tool/tool.cc View File

@@ -29,8 +29,6 @@
#include "internal.h"


namespace bssl {

typedef bool (*tool_func_t)(const std::vector<std::string> &args);

struct Tool {
@@ -81,8 +79,7 @@ static tool_func_t FindTool(const std::string &name) {
}
}


static int Main(int argc, char **argv) {
int main(int argc, char **argv) {
#if defined(OPENSSL_WINDOWS)
// Read and write in binary mode. This makes bssl on Windows consistent with
// bssl on other platforms, and also makes it consistent with MSYS's commands
@@ -127,9 +124,3 @@ static int Main(int argc, char **argv) {

return !tool(args);
}

} // namespace bssl

int main(int argc, char **argv) {
return bssl::Main(argc, argv);
}

+ 0
- 4
tool/transport_common.cc View File

@@ -51,8 +51,6 @@ typedef int ssize_t;
#include "transport_common.h"


namespace bssl {

#if !defined(OPENSSL_WINDOWS)
static int closesocket(int sock) {
return close(sock);
@@ -539,5 +537,3 @@ bool DoSMTPStartTLS(int sock) {

return true;
}

} // namespace bssl

+ 0
- 6
tool/transport_common.h View File

@@ -18,9 +18,6 @@
#include <openssl/ssl.h>
#include <string.h>


namespace bssl {

// InitSocketLibrary calls the Windows socket init functions, if needed.
bool InitSocketLibrary();

@@ -46,7 +43,4 @@ bool TransferData(SSL *ssl, int sock);
// returns true on success and false otherwise.
bool DoSMTPStartTLS(int sock);

} // namespace bssl


#endif /* !OPENSSL_HEADER_TOOL_TRANSPORT_COMMON_H */

+ 2
- 9
util/doc.go View File

@@ -72,7 +72,6 @@ type HeaderDecl struct {

const (
cppGuard = "#if defined(__cplusplus)"
endif = "#endif"
commentStart = "/* "
commentEnd = " */"
)
@@ -293,14 +292,8 @@ func (config *Config) parseHeader(path string) (*HeaderFile, error) {
if len(lines) == 0 || lines[0] != "extern \"C\" {" {
return nil, errors.New("no extern \"C\" found after C++ guard")
}

for i, line := range lines {
if line == endif {
lines = lines[i+1:]
lineNo += i + 1
break
}
}
lineNo += 2
lines = lines[2:]

header := &HeaderFile{
Name: filepath.Base(path),


Loading…
Cancel
Save