/* Copyright (C) 2015 The Android Open Source Project
 *
 * 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. */

/* This program generates output that is expected to become
 * NativeConstants.java. This reifies several OpenSSL constants into Java. */

#include <stdio.h>

#include <openssl/ec.h>
#include <openssl/rsa.h>
#include <openssl/ssl.h>
#include <openssl/x509v3.h>
#include <openssl/evp.h>
#if defined(OPENSSL_IS_BORINGSSL)
#include <openssl/aead.h>
#endif

static const char kCopyright[] =
    "/* Copyright (C) 2015 The Android Open Source Project\n"
    " *\n"
    " * Licensed under the Apache License, Version 2.0 (the \"License\");\n"
    " * you may not use this file except in compliance with the License.\n"
    " * You may obtain a copy of the License at\n"
    " *\n"
    " *      http://www.apache.org/licenses/LICENSE-2.0\n"
    " *\n"
    " * Unless required by applicable law or agreed to in writing, software\n"
    " * distributed under the License is distributed on an \"AS IS\" BASIS,\n"
    " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or "
    "implied.\n"
    " * See the License for the specific language governing permissions and\n"
    " * limitations under the License. */\n";

int main(int /* argc */, char ** /* argv */) {
  printf("%s\n", kCopyright);
  printf("/* This file was generated by generate_constants.cc. */\n\n");
  printf("package org.conscrypt;\n\n");
  printf("public final class NativeConstants {\n");

  printf("    public static final boolean HAS_EVP_AEAD = %s;\n",
#if defined(EVP_AEAD_DEFAULT_TAG_LENGTH)
         "true"
#else
         "false"
#endif
  );

#define CONST(x) \
  printf("    public static final int %s = %ld;\n", #x, (long int)x)
#define CONST_MINUS_1(x) printf("    public static final int %s = -1;\n", #x)
  CONST(OPENSSL_EC_NAMED_CURVE);

  CONST(POINT_CONVERSION_COMPRESSED);
  CONST(POINT_CONVERSION_UNCOMPRESSED);

  CONST(EXFLAG_CA);
  CONST(EXFLAG_CRITICAL);

  CONST(EVP_PKEY_RSA);
  CONST(EVP_PKEY_HMAC);
  CONST(EVP_PKEY_EC);

  CONST(RSA_PKCS1_PADDING);
  CONST(RSA_NO_PADDING);

  CONST(SSL_MODE_SEND_FALLBACK_SCSV);
  CONST(SSL_MODE_CBC_RECORD_SPLITTING);
  CONST(SSL_MODE_HANDSHAKE_CUTTHROUGH);

  CONST(SSL_OP_NO_TICKET);
  CONST(SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION);
  CONST(SSL_OP_NO_SSLv3);
  CONST(SSL_OP_NO_TLSv1);
  CONST(SSL_OP_NO_TLSv1_1);
  CONST(SSL_OP_NO_TLSv1_2);

  CONST(SSL_SENT_SHUTDOWN);
  CONST(SSL_RECEIVED_SHUTDOWN);

  CONST(TLS_CT_RSA_SIGN);
  CONST(TLS_CT_ECDSA_SIGN);

#if defined(TLS_CT_RSA_FIXED_DH)
  CONST(TLS_CT_RSA_FIXED_DH);
#else
  CONST_MINUS_1(TLS_CT_RSA_FIXED_DH);
#endif
#if defined(TLS_CT_RSA_FIXED_ECDH)
  CONST(TLS_CT_RSA_FIXED_ECDH);
#else
  CONST_MINUS_1(TLS_CT_RSA_FIXED_ECDH);
#endif
#if defined(TLS_CT_ECDSA_FIXED_ECDH)
  CONST(TLS_CT_ECDSA_FIXED_ECDH);
#else
  CONST_MINUS_1(TLS_CT_ECDSA_FIXED_ECDH);
#endif

  CONST(SSL_VERIFY_NONE);
  CONST(SSL_VERIFY_PEER);
  CONST(SSL_VERIFY_FAIL_IF_NO_PEER_CERT);

  CONST(SSL_ST_CONNECT);
  CONST(SSL_ST_ACCEPT);
  CONST(SSL_ST_MASK);
  CONST(SSL_ST_INIT);
  CONST(SSL_ST_OK);
  CONST(SSL_ST_RENEGOTIATE);
  CONST(SSL_CB_LOOP);
  CONST(SSL_CB_EXIT);
  CONST(SSL_CB_READ);
  CONST(SSL_CB_WRITE);
  CONST(SSL_CB_ALERT);
  CONST(SSL_CB_READ_ALERT);
  CONST(SSL_CB_WRITE_ALERT);
  CONST(SSL_CB_ACCEPT_LOOP);
  CONST(SSL_CB_ACCEPT_EXIT);
  CONST(SSL_CB_CONNECT_LOOP);
  CONST(SSL_CB_CONNECT_EXIT);
  CONST(SSL_CB_HANDSHAKE_START);
  CONST(SSL_CB_HANDSHAKE_DONE);

  CONST(SSL3_RT_MAX_PACKET_SIZE);
#undef CONST

  printf("}\n");

  return 0;
}
