1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
/** -*-C-*-ish
Kaya standard library
Copyright (C) 2006 Chris Morris
This file is distributed under the terms of the GNU Lesser General
Public Licence. See COPYING for licence.
*/
module TLS;
import Prelude;
%include "tls_glue.h";
%include "gnutls/gnutls.h";
%imported "tls_glue";
%link "gnutls";
%link "gcrypt"; // needed for minGW, harmless on POSIX
abstract data TLSsession(Ptr sess, Ptr conn, Ptr cred);
"TLS handshake failed"
public Exception TLSFailed(Int err) = Exception("TLS Handshake failed (gnutls error "+err+")",200);
foreign "tls_glue.o" {
Void global_init_TLS() = gnutls_global_init;
Ptr init_TLS(Ptr cred) = do_gnutls_init;
Ptr initcred_TLS() = do_gnutls_makecred;
Int assign_TLS(Ptr tls, Ptr conn) = do_gnutls_transport;
Void put_TLS(Ptr tls, String toput) = do_gnutls_put;
String get_TLS(Ptr tls, Ptr vm) = do_gnutls_get;
Void close_TLS(Ptr tls, Ptr cred) = do_gnutls_close;
}
public TLSsession makeTLS(Ptr conn) {
global_init_TLS();
cred = initcred_TLS();
tls = init_TLS(cred);
err = assign_TLS(tls,conn);
if (err < 0) {
throw(TLSFailed(err));
}
return TLSsession(tls,conn,cred);
}
public Void putTLS(TLSsession tls, String toput) {
put_TLS(tls.sess,toput);
}
public String getTLS(TLSsession tls) {
vm = getVM();
output = "";
temp = ".";
while (temp != "") {
temp = get_TLS(tls.sess,vm);
output += temp;
}
return output;
}
public Void closeTLS(TLSsession tls) {
close_TLS(tls.sess,tls.cred);
}
|