/// <summary> /// Attest an Intel SGX enclave. /// </summary> /// <param name="quote">An Intel SGX "quote". /// See https://software.intel.com/content/www/us/en/develop/articles/code-sample-intel-software-guard-extensions-remote-attestation-end-to-end-example.html for more information.</param> /// <param name="initTimeData">Data provided when the enclave was created.</param> /// <param name="initTimeDataIsObject">true if the initTimeData parameter should be treated as an object, false if it should be treated as binary.</param> /// <param name="runTimeData">Data provided when the quote was generated.</param> /// <param name="runTimeDataIsObject">true if the runTimeData parameter should be treated as an object, false if it should be treated as binary.</param> /// <param name="async">true if the API call should be asynchronous, false otherwise.</param> /// <param name="cancellationToken">Cancellation token used to cancel the request.</param> /// <returns>An <see cref="AttestationResponse{AttestationResult}"/> which contains the validated claims for the supplied <paramref name="quote"/>, <paramref name="runTimeData"/>, and <paramref name="initTimeData"/></returns> private async Task <AttestationResponse <AttestationResult> > AttestSgxEnclaveInternal(ReadOnlyMemory <byte> quote, BinaryData initTimeData, bool initTimeDataIsObject, BinaryData runTimeData, bool runTimeDataIsObject, bool async, CancellationToken cancellationToken = default) { Argument.AssertNotNull(runTimeData, nameof(runTimeData)); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(AttestationClient)}.{nameof(AttestSgxEnclave)}"); scope.Start(); try { var attestSgxEnclaveRequest = new AttestSgxEnclaveRequest { Quote = quote.ToArray(), InitTimeData = initTimeData != null ? new InitTimeData { Data = initTimeData.ToArray(), DataType = initTimeDataIsObject ? DataType.Json : DataType.Binary, } : null, RuntimeData = runTimeData != null ? new RuntimeData { Data = runTimeData.ToArray(), DataType = runTimeDataIsObject ? DataType.Json : DataType.Binary, } : null, }; Response <AttestationResponse> response; if (async) { response = await _restClient.AttestSgxEnclaveAsync(attestSgxEnclaveRequest, cancellationToken).ConfigureAwait(false); } else { response = _restClient.AttestSgxEnclave(attestSgxEnclaveRequest, cancellationToken); } var attestationToken = new AttestationToken(response.Value.Token); if (_options.TokenOptions.ValidateToken) { await attestationToken.ValidateTokenInternalAsync(_options.TokenOptions, await GetSignersAsync(cancellationToken).ConfigureAwait(false), async, cancellationToken).ConfigureAwait(false); } return(new AttestationResponse <AttestationResult>(response.GetRawResponse(), attestationToken)); } catch (Exception ex) { scope.Failed(ex); throw; } }