/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */
Installing OpenSSL - 
    On Mac: 
        brew install openssl
    On Linux :

Set up the certificate for testing. The files generated by this set of steps are used by the boost example programs.
These are also the steps used to generate the test certificates used by the Drillbit unit tests.

    Generate a private key

        openssl genrsa -des3 -out drillTestServerKey.pem 1024

    Generate Certificate signing request

        openssl req -new -key drillTestServerKey.pem -out drillTestServer.csr

    Sign certificate with private key

        openssl x509 -req -days 3650 -in drillTestServer.csr -signkey drillTestServerKey.pem -out drillTestCert.pem

    Remove password requirement (needed for example)

        cp drillTestServerKey.pem drillTestServerKey.safe.pem
        openssl rsa -in drillTestServerKey.safe.pem -out drillTestServerKey.pem

    Generate dhparam file

        openssl dhparam -out dh512.pem 512

    [For use in JAVA environments] Export to pkcs12 format

        openssl pkcs12 -export -out drillTestCert.p12 -inkey drillTestServerKey.pem -in drillTestCert.pem 

    This will provide :
        drillTestServerKey.pem - Server private key
        drillTestCert.pem - Client, Certificate Chain File
        dh512.pem - Diffie-Hellman parameters

Running CMake 
    On MacOs
        Run cmake from the build directory using: 
            cmake -G Xcode -DOPENSSL_ROOT_DIR="/usr/local/opt/openssl" -DCMAKE_BUILD_TYPE=Debug ..
