/*
* Skips all whitespace anywhere. Converts characters, four at a time, starting
* at (or after) src from base - 64 numbers into three 8 bit bytes in the
- * target area. it returns the number of data bytes stored at the target, or -1
+ * target area. it returns the number of data bytes stored at the target, or -E_BASE64
* on error.
*/
-static int base64_decode(char const *src, unsigned char *target, size_t targsize)
+int base64_decode(char const *src, unsigned char *target, size_t targsize)
{
unsigned int tarindex, state;
int ch;
pos = strchr(Base64, ch);
if (pos == 0) /* A non-base64 character. */
- return -1;
+ return -E_BASE64;
switch (state) {
case 0:
if (target) {
if (tarindex >= targsize)
- return (-1);
+ return -E_BASE64;
target[tarindex] = (pos - Base64) << 2;
}
state = 1;
case 1:
if (target) {
if (tarindex + 1 >= targsize)
- return (-1);
+ return -E_BASE64;
target[tarindex] |= (pos - Base64) >> 4;
target[tarindex+1] = ((pos - Base64) & 0x0f)
<< 4 ;
case 2:
if (target) {
if (tarindex + 1 >= targsize)
- return (-1);
+ return -E_BASE64;
target[tarindex] |= (pos - Base64) >> 2;
target[tarindex+1] = ((pos - Base64) & 0x03)
<< 6;
case 3:
if (target) {
if (tarindex >= targsize)
- return (-1);
+ return -E_BASE64;
target[tarindex] |= (pos - Base64);
}
tarindex++;
switch (state) {
case 0: /* Invalid = in first position */
case 1: /* Invalid = in second position */
- return (-1);
+ return -E_BASE64;
case 2: /* Valid, means one byte of info */
/* Skip any number of spaces. */
break;
/* Make sure there is another trailing = sign. */
if (ch != Pad64)
- return (-1);
+ return -E_BASE64;
ch = *src++; /* Skip the = */
/* Fall through to "single trailing =" case. */
/* FALLTHROUGH */
*/
for (; ch != '\0'; ch = *src++)
if (!isspace(ch))
- return (-1);
+ return -E_BASE64;
/*
* Now make sure for cases 2 and 3 that the "extra"
* subliminal channel.
*/
if (target && target[tarindex] != 0)
- return (-1);
+ return -E_BASE64;
}
} else {
/*
* have no partial bytes lying around.
*/
if (state != 0)
- return (-1);
+ return -E_BASE64;
}
- return (tarindex);
+ return tarindex;
}
int uudecode(const char *src, unsigned char *target, size_t targsize)
*p = '\0';
len = base64_decode(encoded, target, targsize);
free(encoded);
- return len >= 0? len : -E_BASE64;
+ return len;
}
/*
return 1;
}
-/**
- * Convert a hash value to ascii format.
- *
- * \param hash the hash value.
- * \param asc Result pointer.
- *
- * \a asc must point to an area of at least 2 * \p HASH_SIZE + 1 bytes which
- * will be filled by the function with the ascii representation of the hash
- * value given by \a hash, and a terminating \p NULL byte.
- */
void hash_to_asc(unsigned char *hash, char *asc)
{
int i;
asc[2 * HASH_SIZE] = '\0';
}
-/**
- * Compare two hashes.
- *
- * \param h1 Pointer to the first hash value.
- * \param h2 Pointer to the second hash value.
- *
- * \return 1, -1, or zero, depending on whether \a h1 is greater than,
- * less than or equal to h2, respectively.
- */
int hash_compare(unsigned char *h1, unsigned char *h2)
{
int i;
return 0;
}
-/**
- * Receive a buffer, decrypt it and write terminating NULL byte.
- *
- * \param scc The context.
- * \param buf The buffer to write the decrypted data to.
- * \param size The size of \a buf.
- *
- * Read at most \a size - 1 bytes from file descriptor given by \a scc, decrypt
- * the received data and write a NULL byte at the end of the decrypted data.
- *
- * \return The return value of the underlying call to \ref
- * sc_recv_bin_buffer().
- */
int sc_recv_buffer(struct stream_cipher_context *scc, char *buf, size_t size)
{
int n;
return n;
}
-/**
- * Encrypt and send a \p NULL-terminated buffer.
- *
- * \param scc The context.
- * \param buf The buffer to send.
- *
- * \return The return value of the underyling call to sc_send_bin_buffer().
- */
-int sc_send_buffer(struct stream_cipher_context *scc, const char *buf)
+int sc_send_buffer(struct stream_cipher_context *scc, char *buf)
{
return sc_send_bin_buffer(scc, buf, strlen(buf));
}
-/**
- * Format, encrypt and send a buffer.
- *
- * \param scc The context.
- * \param fmt A format string.
- *
- * \return The return value of the underyling call to sc_send_buffer().
- */
__printf_2_3 int sc_send_va_buffer(struct stream_cipher_context *scc,
const char *fmt, ...)
{