10
10
* Copyright (c) 1998, 1999 Kungliga Tekniska H�gskolan
11
11
* (Royal Institute of Technology, Stockholm, Sweden).
13
* Copyright (C) 2001 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
12
15
* All rights reserved.
14
17
* Redistribution and use in source and binary forms, with or without
67
70
#define min(a, b) ((a) < (b) ? (a) : (b))
69
72
static const struct {
70
enum protection_level level;
73
enum protection_level level;
72
75
} level_names[] = {
73
{ prot_clear, "clear" },
74
{ prot_safe, "safe" },
75
{ prot_confidential, "confidential" },
76
{ prot_private, "private" }
76
{ prot_clear, "clear" },
77
{ prot_safe, "safe" },
78
{ prot_confidential, "confidential" },
79
{ prot_private, "private" }
79
82
static enum protection_level
155
158
b = block_read(fd, &len, sizeof(len));
160
163
len = ntohl(len);
161
164
buf->data = realloc(buf->data, len);
162
165
b = buf->data ? block_read(fd, buf->data, len) : -1;
167
170
buf->size = (conn->mech->decode)(conn->app_data, buf->data, len,
168
171
conn->data_prot, conn);
174
177
buffer_read(struct krb4buffer *buf, void *data, size_t len)
176
len = min(len, buf->size - buf->index);
177
memcpy(data, (char*)buf->data + buf->index, len);
179
len = min(len, buf->size - buf->index);
180
memcpy(data, (char*)buf->data + buf->index, len);
183
186
buffer_write(struct krb4buffer *buf, void *data, size_t len)
185
if(buf->index + len > buf->size) {
187
if(buf->data == NULL)
190
tmp = realloc(buf->data, buf->index + len);
194
buf->size = buf->index + len;
196
memcpy((char*)buf->data + buf->index, data, len);
188
if(buf->index + len > buf->size) {
190
if(buf->data == NULL)
193
tmp = realloc(buf->data, buf->index + len);
197
buf->size = buf->index + len;
199
memcpy((char*)buf->data + buf->index, data, len);
202
205
Curl_sec_read(struct connectdata *conn, int fd, void *buffer, int length)
207
if(conn->sec_complete == 0 || conn->data_prot == 0)
208
return read(fd, buffer, length);
210
if(conn->in_buffer.eof_flag){
211
conn->in_buffer.eof_flag = 0;
210
if(conn->sec_complete == 0 || conn->data_prot == 0)
211
return read(fd, buffer, length);
213
if(conn->in_buffer.eof_flag){
214
conn->in_buffer.eof_flag = 0;
218
len = buffer_read(&conn->in_buffer, buffer, length);
221
buffer = (char*)buffer + len;
224
if(sec_get_data(conn, fd, &conn->in_buffer) < 0)
226
if(conn->in_buffer.size == 0) {
228
conn->in_buffer.eof_flag = 1;
215
231
len = buffer_read(&conn->in_buffer, buffer, length);
218
234
buffer = (char*)buffer + len;
221
if(sec_get_data(conn, fd, &conn->in_buffer) < 0)
223
if(conn->in_buffer.size == 0) {
225
conn->in_buffer.eof_flag = 1;
228
len = buffer_read(&conn->in_buffer, buffer, length);
231
buffer = (char*)buffer + len;
255
258
bytes = Curl_base64_encode(conn->data, (char *)buf, bytes, &cmdbuf);
257
260
if(protlevel == prot_private)
258
block_write(fd, "ENC ", 4);
261
block_write(fd, "ENC ", 4);
260
block_write(fd, "MIC ", 4);
263
block_write(fd, "MIC ", 4);
261
264
block_write(fd, cmdbuf, bytes);
262
265
block_write(fd, "\r\n", 2);
263
Curl_infof(conn->data, "%s %s\n", protlevel == prot_private ? "ENC" : "MIC", cmdbuf);
266
Curl_infof(conn->data, "%s %s\n",
267
protlevel == prot_private ? "ENC" : "MIC", cmdbuf);
267
272
bytes = htonl(bytes);
268
273
block_write(fd, &bytes, sizeof(bytes));
269
274
block_write(fd, buf, ntohl(bytes));
278
283
if(conn->data_prot != prot_clear) {
279
284
if(conn->out_buffer.index > 0){
280
285
Curl_sec_write(conn, fd,
281
conn->out_buffer.data, conn->out_buffer.index);
286
conn->out_buffer.data, conn->out_buffer.index);
282
287
conn->out_buffer.index = 0;
284
289
sec_send(conn, fd, NULL, 0);