wvdbusserver: implement NameHasOwner request.
[wvstreams.git] / crypto / wvcountermode.cc
blobcc341b96ef4a77d6c3d5dc0274015dde807f00b0
1 /*
2 * Worldvisions Tunnel Vision Software:
3 * Copyright (C) 1997-2002 Net Integration Technologies, Inc.
4 *
5 * A 'counter mode' cryptography engine abstraction.
6 */
7 #include "wvcountermode.h"
10 WvCounterModeEncoder::WvCounterModeEncoder(WvEncoder *_keycrypt,
11 const void *_counter, size_t _countersize) :
12 keycrypt(_keycrypt), counter(NULL)
14 setcounter(_counter, _countersize);
18 WvCounterModeEncoder::~WvCounterModeEncoder()
20 delete keycrypt;
21 deletev counter;
25 void WvCounterModeEncoder::setcounter(const void *_counter, size_t _countersize)
27 deletev counter;
28 counter = new unsigned char[_countersize];
29 countersize = _countersize;
30 memcpy(counter, _counter, countersize);
34 void WvCounterModeEncoder::getcounter(void *_counter) const
36 memcpy(_counter, counter, countersize);
40 void WvCounterModeEncoder::incrcounter()
42 for (size_t i = 0; i < countersize && ! ++counter[i]; ++i);
46 bool WvCounterModeEncoder::_encode(WvBuf &inbuf, WvBuf &outbuf,
47 bool flush)
49 bool success = true;
50 size_t avail = inbuf.used();
51 size_t offset = outbuf.used();
53 // generate a key stream
54 size_t len;
55 for (len = avail; len >= countersize; len -= countersize)
57 counterbuf.reset(counter, countersize);
58 success = keycrypt->encode(counterbuf, outbuf, true);
59 if (! success) break;
60 incrcounter();
62 if (flush && len != 0 && success)
64 counterbuf.reset(counter, countersize);
65 success = keycrypt->encode(counterbuf, outbuf, true);
66 if (success)
68 outbuf.unalloc(countersize - len);
69 len = 0;
70 incrcounter();
72 else
73 outbuf.unalloc(outbuf.used() - offset - avail);
75 avail -= len;
77 // XOR in the data
78 while (avail > 0)
80 len = outbuf.optpeekable(offset);
81 unsigned char *dataout = outbuf.mutablepeek(offset, len);
82 size_t lenopt = inbuf.optgettable();
83 if (len > lenopt)
84 len = lenopt;
85 const unsigned char *datain = inbuf.get(len);
87 if (len >= avail)
89 len = avail;
90 avail = 0;
92 else
94 avail -= len;
95 offset += len;
97 while (len-- > 0)
98 *(dataout++) ^= *(datain++);
100 return success;