File: TLS.k

package info (click to toggle)
kaya 0.2.0-6
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 3,012 kB
  • ctags: 1,307
  • sloc: cpp: 6,691; haskell: 4,833; sh: 2,868; yacc: 768; makefile: 700; perl: 87
file content (62 lines) | stat: -rw-r--r-- 1,496 bytes parent folder | download
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);
}