summaryrefslogtreecommitdiff
path: root/t/ssl.pas
blob: 22d4d796dfc20aa64031813361cf654911af0cb6 (plain)
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
program ssl;

type
    hostent=record
        h_name:^char;
        h_aliases:^^char;
        h_addrtype:integer;
        h_length:integer;
        h_addr_list:^^char
    end;
    sockaddr_in=record
        sin_family:short;
        sin_port:short;
        sin_addr:array[0..3] of char;
        sin_zero:array[0..7] of char
    end;

const
    AF_INET=2;
    SOCK_STREAM=1;
    IPPROTO_TCP=6;

extern memset(dst:^void; n:integer; size:int64):^void;
extern memcpy(dst:^void; src:^void; size:int64):^void;
extern sprintf(s:^char; fmt:^char; ...):integer;
extern printf(fmt:^char; ...):int64;

extern socket(domain:integer; socktype:integer; protocol:integer):integer;
extern htons(port:short):short;
extern gethostbyname(name:^char):^hostent;
extern connect(s:integer; addr:^sockaddr_in; size:integer):integer;

extern TLS_method():^void;
extern SSL_CTX_new(meth:^void):^void;
extern SSL_new(meth:^void):^void;
extern SSL_set_fd(ssl:^void; fd:integer):integer;
extern SSL_connect(ssl:^void):integer;
extern SSL_write(ssl:^void; buf:^void; num:integer):integer;
extern SSL_read(ssl:^void; buf:^void; num:integer):integer;
extern SSL_shutdown(ssl:^void):integer;
extern SSL_free(ssl:^void):void;
extern SSL_CTX_free(ssl:^void):void;

function main(argc:integer; argv:^^char):integer;
var
    s, len, size, thissize:integer;
    ssl, ctx:^void;
    host:^hostent;
    addr:sockaddr_in;
    buf:array[0..1023] of char;
    p:^char;
begin
    s := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    memset(@addr, 0, 16);
    addr.sin_family := AF_INET;
    addr.sin_port := htons(443);
    host := gethostbyname(argv[1]);
    p := host^.h_addr_list[0];
    memcpy(@addr.sin_addr, p, 4);
    connect(s, @addr, 16);
    ctx := SSL_CTX_new(TLS_method());
    ssl := SSL_new(ctx);
    SSL_set_fd(ssl, s);
    SSL_connect(ssl);
    len := sprintf(@buf, 'GET / HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n', argv[1]);
    size := 0;
    while len>0 do begin
        thissize := SSL_write(ssl, @buf[size], len - size);
        len := len - thissize;
        size := size + thissize;
    end;
    while true do begin
        size := SSL_read(ssl, @buf, 1023);
        if size<=0 then break;
        buf[size] := '\0';
        printf('%s', @buf);
    end;
    SSL_shutdown(ssl);
    SSL_free(ssl);
    SSL_CTX_free(ctx);
    main := 0;
end;