intel-tee-quote-verification-sys 0.3.0

Intel(R) TEE Quote Verification Rust Library
/*
 * Copyright (C) 2011-2021 Intel Corporation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   * Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *   * Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in
 *     the documentation and/or other materials provided with the
 *     distribution.
 *   * Neither the name of Intel Corporation nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

use std::env;
use std::path::PathBuf;

fn main() {
    // Tell cargo to tell rustc to link the system
    // sgx-dcap-quoteverify shared library.
    println!("cargo:rustc-link-lib=sgx_dcap_quoteverify");

    // Tell cargo to invalidate the built crate whenever the wrapper changes
    println!("cargo:rerun-if-changed=bindings.h");

    // The bindgen::Builder is the main entry point
    // to bindgen, and lets you build up options for
    // the resulting bindings.
    let mut builder = bindgen::Builder::default();

    // Set sdk to search path if SGX_SDK is in environment variable
    if let Ok(val) = env::var("SGX_SDK") {
        let mut sdk_inc = String::from("-I");
        sdk_inc.push_str(&val);
        sdk_inc.push_str("/include/");
        // Include search path
        builder = builder.clang_arg(sdk_inc);
    }

    let bindings = builder
        // The input header we would like to generate
        // bindings for.
        .header("bindings.h")
        // C enums returned by the QVL across the FFI boundary need
        // newtype_enum, not rustified_enum: the library is loaded from
        // the system (`cargo:rustc-link-lib=sgx_dcap_quoteverify`) and
        // may be a newer version than the headers used at build time.
        // If such a library ever returns a discriminant the bindgen-
        // generated Rust `enum` does not list, materialising that value
        // as the Rust enum is instant UB (invalid-enum-variant).
        // `newtype_enum` keeps the underlying integer representation
        // while still exposing the named values as associated constants,
        // so unknown discriminants are merely unrecognised, not UB.
        .newtype_enum("_quote3_error_t")
        .newtype_enum("_sgx_ql_qv_result_t")
        // Input-only enums (Rust -> C) keep `rustified_enum`: Rust only
        // ever constructs the known variants, so there is no invalid-
        // discriminant hazard, and a closed enum preserves type safety
        // on the safe-wrapper API surface.
        .rustified_enum("_sgx_ql_request_policy")
        .rustified_enum("sgx_qv_path_type_t")
        // Disable Debug trait for packed C structures
        .no_debug("_quote_t")
        .no_debug("_sgx_ql_auth_data_t")
        .no_debug("_sgx_ql_certification_data_t")
        .no_debug("_sgx_ql_ecdsa_sig_data_t")
        .no_debug("_sgx_quote3_t")
        .no_debug("_sgx_ql_att_key_id_param_t")
        // Enable Default trait
        .derive_default(true)
        // Tell cargo to invalidate the built crate whenever any of the
        // included header files changed.
        .parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
        // Finish the builder and generate the bindings.
        .generate()
        // Unwrap the Result and panic on failure.
        .expect("Unable to generate bindings");

    // Write the bindings to the $OUT_DIR/bindings.rs file.
    let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
    bindings
        .write_to_file(out_path.join("bindings.rs"))
        .expect("Couldn't write bindings!");
}