#ifndef _EAP8021X_EAPTLSUTIL_H
#define _EAP8021X_EAPTLSUTIL_H
#include <Security/SecureTransport.h>
#include <Security/SecCertificate.h>
#include <Security/SecPolicy.h>
#include <CoreFoundation/CFBase.h>
#include <CoreFoundation/CFData.h>
#include <CoreFoundation/CFArray.h>
#include <CoreFoundation/CFDictionary.h>
#include <stdbool.h>
#include <EAP8021X/EAP.h>
#include <EAP8021X/EAPTLS.h>
#include <EAP8021X/EAPClientTypes.h>
#include <TargetConditionals.h>
typedef struct memoryBuffer_s {
void * data;
size_t length;
size_t offset;
bool complete;
} memoryBuffer, *memoryBufferRef;
typedef struct {
bool debug;
memoryBufferRef read;
memoryBufferRef write;
} memoryIO, * memoryIORef;
SSLContextRef
EAPSSLContextCreate(SSLProtocol protocol, bool is_server,
SSLReadFunc func_read, SSLWriteFunc func_write,
void * handle, char * peername, OSStatus * ret_status);
SSLContextRef
EAPTLSMemIOContextCreate(bool is_server, memoryIORef mem_io,
char * peername, OSStatus * ret_status);
#if 0
OSStatus
EAPSSLContextSetCipherRestrictions(SSLContextRef ctx, char cipherRestrict);
const char *
EAPSSLCipherSuiteString(SSLCipherSuite cs);
const char *
EAPSSLProtocolVersionString(SSLProtocol prot);
#endif
const char *
EAPSSLErrorString(OSStatus err);
OSStatus
EAPSSLMemoryIORead(SSLConnectionRef connection, void * data_buf,
size_t * data_length);
OSStatus
EAPSSLMemoryIOWrite(SSLConnectionRef connection, const void * data_buf,
size_t * data_length);
OSStatus
EAPTLSComputeKeyData(SSLContextRef ssl_context,
const void * label, int label_length,
void * key, int key_length);
void
memoryBufferClear(memoryBufferRef buf);
void
memoryBufferInit(memoryBufferRef buf);
void
memoryBufferAllocate(memoryBufferRef buf, size_t length);
bool
memoryBufferIsComplete(memoryBufferRef buf);
bool
memoryBufferAddData(memoryBufferRef buf, const void * data, size_t length);
void
memoryIOClearBuffers(memoryIORef mem_io);
void
memoryIOInit(memoryIORef mem_io, memoryBufferRef read_buf,
memoryBufferRef write_buf);
void
memoryIOSetDebug(memoryIORef mem_io, bool debug);
EAPPacketRef
EAPTLSPacketCreate(EAPCode code, int type, u_char identifier, int mtu,
memoryBufferRef buf, int * ret_fraglen);
EAPPacketRef
EAPTLSPacketCreate2(EAPCode code, int type, u_char identifier, int mtu,
memoryBufferRef buf, int * ret_fraglen,
bool always_mark_first);
OSStatus
EAPSSLCopyPeerCertificates(SSLContextRef context, CFArrayRef * certs);
EAPClientStatus
EAPTLSVerifyServerCertificateChain(CFDictionaryRef properties,
CFArrayRef server_certs,
OSStatus * ret_status);
OSStatus
EAPSecPolicyCopy(SecPolicyRef * ret_policy);
CFStringRef
EAPTLSPacketCopyDescription(EAPTLSPacketRef eaptls_pkt, bool * packet_is_valid);
#if TARGET_OS_EMBEDDED
bool
EAPTLSSecTrustSaveExceptionsBinding(SecTrustRef trust,
CFStringRef domain, CFStringRef identifier,
CFStringRef server_hash_str);
void
EAPTLSSecTrustApplyExceptionsBinding(SecTrustRef trust, CFStringRef domain,
CFStringRef identifier,
CFStringRef server_cert_hash);
void
EAPTLSRemoveTrustExceptionsBindings(CFStringRef domain,
CFStringRef identifier);
SecTrustRef
EAPTLSCreateSecTrust(CFDictionaryRef properties, CFArrayRef server_certs,
CFStringRef domain, CFStringRef identifier);
#endif
OSStatus
EAPTLSCopyIdentityTrustChain(SecIdentityRef sec_identity,
CFDictionaryRef properties,
CFArrayRef * ret_array);
#endif