]> git.pld-linux.org Git - packages/beecrypt.git/blobdiff - beecrypt-from_rpm.patch
- additional functions for base64 support
[packages/beecrypt.git] / beecrypt-from_rpm.patch
diff --git a/beecrypt-from_rpm.patch b/beecrypt-from_rpm.patch
new file mode 100644 (file)
index 0000000..539855d
--- /dev/null
@@ -0,0 +1,353 @@
+diff -ru beecrypt/base64.c beecrypt.rpm/base64.c
+--- beecrypt/base64.c  Thu May 15 15:35:52 2003
++++ beecrypt.rpm/base64.c      Fri May 16 16:16:40 2003
+@@ -63,10 +55,10 @@
+               while (div > 0)
+               {
+-                      buf[0] = to_b64[ (data[0] >> 2) & 0x3f];
+-                      buf[1] = to_b64[((data[0] << 4) & 0x30) | ((data[1] >> 4) & 0xf)];
+-                      buf[2] = to_b64[((data[1] << 2) & 0x3c) | ((data[2] >> 6) & 0x3)];
+-                      buf[3] = to_b64[  data[2] & 0x3f];
++                      buf[0] = to_b64[ ((unsigned)data[0] >> 2) & 0x3f];
++                      buf[1] = to_b64[(((unsigned)data[0] << 4) & 0x30) | (((unsigned)data[1] >> 4) & 0xf)];
++                      buf[2] = to_b64[(((unsigned)data[1] << 2) & 0x3c) | (((unsigned)data[2] >> 6) & 0x3)];
++                      buf[3] = to_b64[  (unsigned)data[2] & 0x3f];
+                       data += 3;
+                       buf += 4;
+                       div--;
+@@ -81,16 +73,16 @@
+               switch (rem)
+               {
+               case 2:
+-                      buf[0] = to_b64[ (data[0] >> 2) & 0x3f];
+-                      buf[1] = to_b64[((data[0] << 4) & 0x30) + ((data[1] >> 4) & 0xf)];
+-                      buf[2] = to_b64[ (data[1] << 2) & 0x3c];
++                      buf[0] = to_b64[ ((unsigned)data[0] >> 2) & 0x3f];
++                      buf[1] = to_b64[(((unsigned)data[0] << 4) & 0x30) + (((unsigned)data[1] >> 4) & 0xf)];
++                      buf[2] = to_b64[ ((unsigned)data[1] << 2) & 0x3c];
+                       buf[3] = '=';
+                       buf += 4;
+                       chars += 4;
+                       break;
+               case 1:
+-                      buf[0] = to_b64[ (data[0] >> 2) & 0x3f];
+-                      buf[1] = to_b64[ (data[0] << 4) & 0x30];
++                      buf[0] = to_b64[ ((unsigned)data[0] >> 2) & 0x3f];
++                      buf[1] = to_b64[ ((unsigned)data[0] << 4) & 0x30];
+                       buf[2] = '=';
+                       buf[3] = '=';
+                       buf += 4;
+@@ -183,6 +177,7 @@
+                                               if (isspace(ch))
+                                                       continue;
++                                              bits = 0;
+                                               if ((ch >= 'A') && (ch <= 'Z'))
+                                               {
+                                                       bits = (byte) (ch - 'A');
+@@ -237,3 +232,222 @@
+       return rc;
+ }
++
++int b64encode_chars_per_line = B64ENCODE_CHARS_PER_LINE;
++
++const char * b64encode_eolstr = B64ENCODE_EOLSTR;
++
++/*@-internalglobs -modfilesys @*/
++char * b64encode (const void * data, size_t ns)
++{
++    static char b64enc[] =
++      "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
++    const char *e;
++    const unsigned char *s = data;
++    unsigned char *t, *te;
++    int nt;
++    int lc;
++    unsigned c;
++
++    if (s == NULL)    return NULL;
++    if (*s == '\0')   return calloc(1, sizeof(*t));
++
++    if (ns == 0) ns = strlen(s);
++    nt = ((ns + 2) / 3) * 4;
++
++    /* Add additional bytes necessary for eol string(s). */
++    if (b64encode_chars_per_line > 0 && b64encode_eolstr != NULL) {
++      lc = (nt + b64encode_chars_per_line - 1) / b64encode_chars_per_line;
++      if (((nt + b64encode_chars_per_line - 1) % b64encode_chars_per_line) != 0)
++          ++lc;
++      nt += lc * strlen(b64encode_eolstr);
++    }
++
++    t = te = malloc(nt + 1);
++
++    lc = 0;
++    if (te)
++    while (ns > 0) {
++
++if (0)
++fprintf(stderr, "%7u %02x %02x %02x -> %02x %02x %02x %02x\n",
++(unsigned)ns, (unsigned)s[0], (unsigned)s[1], (unsigned)s[2],
++(unsigned)(s[0] >> 2),
++(unsigned)((s[0] & 0x3) << 4) | (s[1] >> 4),
++(unsigned)((s[1] & 0xf) << 2) | (s[2] >> 6),
++(unsigned)(s[2]& 0x3f));
++      c = *s++;
++      *te++ = b64enc[ (c >> 2) ], lc++;
++      *te++ = b64enc[ ((c & 0x3) << 4) | (*s >> 4) ], lc++;
++      if (--ns == 0) {
++          *te++ = '=';
++          *te++ = '=';
++          continue;
++      }
++      c = *s++;
++      *te++ = b64enc[ ((c & 0xf) << 2) | (*s >> 6) ], lc++;
++      if (--ns == 0) {
++          *te++ = '=';
++          continue;
++      }
++      *te++ = b64enc[ (int)(*s & 0x3f) ], lc++;
++
++      /* Append eol string if desired. */
++      if (b64encode_chars_per_line > 0 && b64encode_eolstr != NULL) {
++          if (lc >= b64encode_chars_per_line) {
++              for (e = b64encode_eolstr; *e != '\0'; e++)
++                  *te++ = *e;
++              lc = 0;
++          }
++      }
++      s++;
++      --ns;
++    }
++
++    if (te) {
++      /* Append eol string if desired. */
++      if (b64encode_chars_per_line > 0 && b64encode_eolstr != NULL) {
++          if (lc != 0) {
++              for (e = b64encode_eolstr; *e != '\0'; e++)
++                  *te++ = *e;
++          }
++      }
++      *te = '\0';
++    }
++
++    /*@-mustfree -compdef @*/
++    return t;
++    /*@=mustfree =compdef @*/
++}
++/*@=globs =internalglobs =modfilesys @*/
++
++/*@-internalglobs -modfilesys @*/
++#define CRC24_INIT 0xb704ceL
++#define CRC24_POLY 0x1864cfbL
++
++char * b64crc (const unsigned char * data, size_t ns)
++{
++    const unsigned char *s = data;
++    uint32_t crc = CRC24_INIT;
++
++    while (ns-- > 0) {
++      int i;
++      crc ^= (*s++) << 16;
++      for (i = 0; i < 8; i++) {
++          crc <<= 1;
++          if (crc & 0x1000000)
++              crc ^= CRC24_POLY;
++      }
++    }
++    crc &= 0xffffff;
++    /*@-unrecog@*/ /* FIX: include endianness.h? */
++    #if !WORDS_BIGENDIAN
++    crc = swapu32(crc);
++    #endif
++    /*@=unrecog@*/
++    data = (byte *)&crc;
++    data++;
++    ns = 3;
++    return b64encode(data, ns);
++}
++/*@=internalglobs =modfilesys @*/
++
++const char * b64decode_whitespace = B64DECODE_WHITESPACE;
++
++/*@-internalglobs -modfilesys @*/
++int b64decode (const char * s, void ** datap, size_t *lenp)
++{
++    unsigned char b64dec[256];
++    const unsigned char *t;
++    unsigned char *te;
++    int ns, nt;
++    unsigned a, b, c, d;
++
++    if (s == NULL)    return 1;
++
++    /* Setup character lookup tables. */
++    memset(b64dec, 0x80, sizeof(b64dec));
++    for (c = 'A'; c <= 'Z'; c++)
++      b64dec[ c ] = 0 + (c - 'A');
++    for (c = 'a'; c <= 'z'; c++)
++      b64dec[ c ] = 26 + (c - 'a');
++    for (c = '0'; c <= '9'; c++)
++      b64dec[ c ] = 52 + (c - '0');
++    b64dec[(unsigned)'+'] = 62;
++    b64dec[(unsigned)'/'] = 63;
++    b64dec[(unsigned)'='] = 0;
++
++    /* Mark whitespace characters. */
++    if (b64decode_whitespace) {
++      const char *e;
++      for (e = b64decode_whitespace; *e != '\0'; e++) {
++          if (b64dec[ (unsigned)*e ] == 0x80)
++              b64dec[ (unsigned)*e ] = 0x81;
++      }
++    }
++    
++    /* Validate input buffer */
++    ns = 0;
++    for (t = s; *t != '\0'; t++) {
++      switch (b64dec[ (unsigned)*t ]) {
++      case 0x80:      /* invalid chararcter */
++if (0)
++fprintf(stderr, "--- b64decode %c(%02x) %02x\n", *t, (unsigned)(*t & 0xff), (unsigned)b64dec[ (unsigned)*t ]);
++          return 3;
++          /*@notreached@*/ /*@switchbreak@*/ break;
++      case 0x81:      /* white space */
++          /*@switchbreak@*/ break;
++      default:
++          ns++;
++          /*@switchbreak@*/ break;
++      }
++    }
++    
++    if (((unsigned)ns) & 0x3) return 2;
++
++    nt = (ns / 4) * 3;
++    t = te = malloc(nt + 1);
++
++    while (ns > 0) {
++
++      /* Get next 4 characters, ignoring whitespace. */
++      while ((a = b64dec[ (unsigned)*s++ ]) == 0x81)
++          ;
++      while ((b = b64dec[ (unsigned)*s++ ]) == 0x81)
++          ;
++      while ((c = b64dec[ (unsigned)*s++ ]) == 0x81)
++          ;
++      while ((d = b64dec[ (unsigned)*s++ ]) == 0x81)
++          ;
++
++if (0)
++fprintf(stderr, "%7u %02x %02x %02x %02x -> %02x %02x %02x\n",
++(unsigned)ns, a, b, c, d,
++(((a << 2) | (b >> 4)) & 0xff),
++(((b << 4) | (c >> 2)) & 0xff),
++(((c << 6) | d) & 0xff));
++
++      ns -= 4;
++      *te++ = (a << 2) | (b >> 4);
++      if (s[-2] == '=') break;
++      *te++ = (b << 4) | (c >> 2);
++      if (s[-1] == '=') break;
++      *te++ = (c << 6) | d;
++    }
++
++    if (ns != 0) {            /* XXX can't happen, just in case */
++      if (t) free((void *)t);
++      return 1;
++    }
++    if (lenp)
++      *lenp = (te - t);
++
++    if (datap)
++      *datap = (void *)t;
++    else
++      if (t) free((void *)t);
++
++    return 0;
++}
++/*@=globs =internalglobs =modfilesys @*/
++/*@=type@*/
+diff -ru beecrypt/base64.h beecrypt.rpm/base64.h
+--- beecrypt/base64.h  Fri Jun 21 14:17:24 2002
++++ beecrypt.rpm/base64.h      Fri May 16 16:16:40 2003
+@@ -27,13 +27,76 @@
+ #include "beecrypt.h"
++/**
++ * Decode white space character set (default).
++ */
++/*@-exportlocal@*/
++/*@unchecked@*/ /*@observer@*/ /*@null@*/
++extern const char * b64decode_whitespace;
++/*@=exportlocal@*/
++#define B64DECODE_WHITESPACE  " \f\n\r\t\v"
++
++/**
++ * Encode 72 characters per line (default).
++ */
++/*@-exportlocal@*/
++/*@unchecked@*/
++extern int b64encode_chars_per_line;
++/*@=exportlocal@*/
++#define B64ENCODE_CHARS_PER_LINE      72
++
++/**
++ * Encode end-of-line string (default).
++ */
++/*@-exportlocal@*/
++/*@unchecked@*/ /*@observer@*/ /*@null@*/
++extern const char * b64encode_eolstr;
++/*@=exportlocal@*/
++#define B64ENCODE_EOLSTR      "\n"
++
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
+-BEECRYPTAPI
++/**
++ * Encode chunks of 3 bytes of binary input into 4 bytes of base64 output.
++ * @param data                binary data
++ * @param ns          no. bytes of data (0 uses strlen(data))
++ * @return            (malloc'd) base64 string
++ */
++BEECRYPTAPI /*@only@*/ /*@null@*/ /*@unused@*/
++char * b64encode (const void * data, size_t ns)
++      /*@*/;
++
++/**
++ * Encode crc of binary input data into 5 bytes of base64 output.
++ * @param data                binary data
++ * @param ns          no. bytes of binary data
++ * @return            (malloc'd) base64 string
++ */
++BEECRYPTAPI /*@only@*/ /*@null@*/ /*@unused@*/
++char * b64crc (const unsigned char * data, size_t ns)
++      /*@*/;
++
++/**
++ * Decode chunks of 4 bytes of base64 input into 3 bytes of binary output.
++ * @param s           base64 string
++ * @retval datap      address of (malloc'd) binary data
++ * @retval lenp               address of no. bytes of binary data
++ * @return            0 on success, 1: s == NULL, 2: bad length, 3: bad char
++ */
++BEECRYPTAPI /*@unused@*/
++int b64decode (const char * s, /*@out@*/ void ** datap, /*@out@*/ size_t *lenp)
++      /*@modifies *datap, *lenp @*/;
++
++/**
++ */
++BEECRYPTAPI /*@only@*/ /*@null@*/ /*@unused@*/
+ char*         b64enc(const memchunk*);
+-BEECRYPTAPI
++
++/**
++ */
++BEECRYPTAPI /*@only@*/ /*@null@*/ /*@unused@*/
+ memchunk*     b64dec(const char*);
+ #ifdef __cplusplus
This page took 0.094104 seconds and 4 git commands to generate.