tcrypto.c - mixmaster - mixmaster 3.0 patched for libressl
 (HTM) git clone git://parazyd.org/mixmaster.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
       tcrypto.c (10677B)
       ---
            1 /* Mixmaster version 3.0  --  (C) 1999 - 2006 Anonymizer Inc. and others.
            2 
            3    Mixmaster may be redistributed and modified under certain conditions.
            4    This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
            5    ANY KIND, either express or implied. See the file COPYRIGHT for
            6    details.
            7 
            8    Interface to cryptographic library
            9    $Id: crypto.c 934 2006-06-24 13:40:39Z rabbi $ */
           10 
           11 
           12 #include "mix3.h"
           13 #include "crypto.h"
           14 #include <assert.h>
           15 #include <string.h>
           16 #include <time.h>
           17 
           18 #ifdef USE_OPENSSL
           19 int digestmem_md5(byte *b, int n, BUFFER *md)
           20 {
           21   byte m[MD5_DIGEST_LENGTH];
           22 
           23   MD5(b, n, m);
           24   buf_reset(md);
           25   buf_append(md, m, MD5_DIGEST_LENGTH);
           26   return (0);
           27 }
           28 
           29 int digest_md5(BUFFER *b, BUFFER *md)
           30 {
           31   return (digestmem_md5(b->data, b->length, md));
           32 }
           33 
           34 int isdigest_md5(BUFFER *b, BUFFER *md)
           35 {
           36   int ret;
           37   BUFFER *newmd;
           38 
           39   newmd = buf_new();
           40   digest_md5(b, newmd);
           41   ret = buf_eq(md, newmd);
           42   buf_free(newmd);
           43   return (ret);
           44 }
           45 
           46 static int digestmem_sha1(byte *b, int n, BUFFER *md)
           47 {
           48   byte m[SHA_DIGEST_LENGTH];
           49 
           50   SHA1(b, n, m);
           51   buf_reset(md);
           52   buf_append(md, m, SHA_DIGEST_LENGTH);
           53   return (0);
           54 }
           55 
           56 int digest_sha1(BUFFER *b, BUFFER *md)
           57 {
           58   return (digestmem_sha1(b->data, b->length, md));
           59 }
           60 
           61 static int digestmem_rmd160(byte *b, int n, BUFFER *md)
           62 {
           63   byte m[RIPEMD160_DIGEST_LENGTH];
           64 
           65   RIPEMD160(b, n, m);
           66   buf_reset(md);
           67   buf_append(md, m, RIPEMD160_DIGEST_LENGTH);
           68   return (0);
           69 }
           70 
           71 int digest_rmd160(BUFFER *b, BUFFER *md)
           72 {
           73   return (digestmem_rmd160(b->data, b->length, md));
           74 }
           75 
           76 #define MAX_RSA_MODULUS_LEN 128
           77 
           78 static int read_seckey(BUFFER *buf, SECKEY *key, const byte id[])
           79 {
           80   BUFFER *md;
           81   int bits;
           82   int len, plen;
           83   byte *ptr;
           84   int err = 0;
           85 
           86   md = buf_new();
           87   bits = buf->data[0] + 256 * buf->data[1];
           88   len = (bits + 7) / 8;
           89   plen = (len + 1) / 2;
           90 
           91   /* due to encryption, buffer size is multiple of 8 */
           92   if (3 * len + 5 * plen + 8 < buf->length || 3 * len + 5 * plen > buf->length)
           93     return (-1);
           94 
           95   ptr = buf->data + 2;
           96 
           97   key->n = BN_bin2bn(ptr, len, NULL);
           98   buf_append(md, ptr, len);
           99   ptr += len;
          100 
          101   key->e = BN_bin2bn(ptr, len, NULL);
          102   buf_append(md, ptr, len);
          103   ptr += len;
          104 
          105   key->d = BN_bin2bn(ptr, len, NULL);
          106   ptr += len;
          107 
          108   key->p = BN_bin2bn(ptr, plen, NULL);
          109   ptr += plen;
          110 
          111   key->q = BN_bin2bn(ptr, plen, NULL);
          112   ptr += plen;
          113 
          114   key->dmp1 = BN_bin2bn(ptr, plen, NULL);
          115   ptr += plen;
          116 
          117   key->dmq1 = BN_bin2bn(ptr, plen, NULL);
          118   ptr += plen;
          119 
          120   key->iqmp = BN_bin2bn(ptr, plen, NULL);
          121   ptr += plen;
          122 
          123   digest_md5(md, md);
          124   if (id)
          125     err = (memcmp(id, md->data, 16) == 0) ? 0 : -1;
          126   buf_free(md);
          127   return (err);
          128 }
          129 
          130 static int read_pubkey(BUFFER *buf, PUBKEY *key, const byte id[])
          131 {
          132   BUFFER *md;
          133   int bits;
          134   int len;
          135   byte *ptr;
          136   int err = 0;
          137 
          138   md = buf_new();
          139   bits = buf->data[0] + 256 * buf->data[1];
          140   len = (bits + 7) / 8;
          141 
          142   if (2 * len + 2 != buf->length)
          143     return (-1);
          144 
          145   ptr = buf->data + 2;
          146 
          147   key->n = BN_bin2bn(ptr, len, NULL);
          148   buf_append(md, ptr, len);
          149   ptr += len;
          150 
          151   key->e = BN_bin2bn(ptr, len, NULL);
          152   buf_append(md, ptr, len);
          153   ptr += len;
          154 
          155   digest_md5(md, md);
          156   if (id)
          157     err = (memcmp(id, md->data, 16) == 0) ? 0 : -1;
          158   buf_free(md);
          159   return (err);
          160 }
          161 
          162 static int write_seckey(BUFFER *sk, SECKEY *key, byte keyid[])
          163 {
          164   byte l[128];
          165   int n;
          166   BUFFER *b, *temp;
          167 
          168   b = buf_new();
          169   temp = buf_new();
          170 
          171   n = BN_bn2bin(key->n, l);
          172   assert(n <= 128);
          173   if (n < 128)
          174     buf_appendzero(b, 128 - n);
          175   buf_append(b, l, n);
          176 
          177   n = BN_bn2bin(key->e, l);
          178   assert(n <= 128);
          179   if (n < 128)
          180     buf_appendzero(b, 128 - n);
          181   buf_append(b, l, n);
          182 
          183   digest_md5(b, temp);
          184   memcpy(keyid, temp->data, 16);
          185 
          186   buf_appendc(sk, 0);
          187   buf_appendc(sk, 4);
          188   buf_cat(sk, b);
          189 
          190   n = BN_bn2bin(key->d, l);
          191   assert(n <= 128);
          192   if (n < 128)
          193     buf_appendzero(sk, 128 - n);
          194   buf_append(sk, l, n);
          195 
          196   n = BN_bn2bin(key->p, l);
          197   assert(n <= 64);
          198   if (n < 64)
          199     buf_appendzero(sk, 64 - n);
          200   buf_append(sk, l, n);
          201 
          202   n = BN_bn2bin(key->q, l);
          203   assert(n <= 64);
          204   if (n < 64)
          205     buf_appendzero(sk, 64 - n);
          206   buf_append(sk, l, n);
          207 
          208   n = BN_bn2bin(key->dmp1, l);
          209   assert(n <= 64);
          210   if (n < 64)
          211     buf_appendzero(sk, 64 - n);
          212   buf_append(sk, l, n);
          213 
          214   n = BN_bn2bin(key->dmq1, l);
          215   assert(n <= 64);
          216   if (n < 64)
          217     buf_appendzero(sk, 64 - n);
          218   buf_append(sk, l, n);
          219 
          220   n = BN_bn2bin(key->iqmp, l);
          221   assert(n <= 64);
          222   if (n < 64)
          223     buf_appendzero(sk, 64 - n);
          224   buf_append(sk, l, n);
          225 
          226   buf_pad(sk, 712);                /* encrypt needs a block size multiple of 8 */
          227 
          228   buf_free(temp);
          229   buf_free(b);
          230   return (0);
          231 }
          232 
          233 static int write_pubkey(BUFFER *pk, PUBKEY *key, byte keyid[])
          234 {
          235   byte l[128];
          236   int n;
          237 
          238   buf_appendc(pk, 0);
          239   buf_appendc(pk, 4);
          240   n = BN_bn2bin(key->n, l);
          241   assert(n <= 128);
          242   if (n < 128)
          243     buf_appendzero(pk, 128 - n);
          244   buf_append(pk, l, n);
          245   n = BN_bn2bin(key->e, l);
          246   assert(n <= 128);
          247   if (n < 128)
          248     buf_appendzero(pk, 128 - n);
          249   buf_append(pk, l, n);
          250   return (0);
          251 }
          252 
          253 int seckeytopub(BUFFER *pub, BUFFER *sec, byte keyid[])
          254 {
          255   RSA *k;
          256   int err = 0;
          257 
          258   k = RSA_new();
          259   err = read_seckey(sec, k, keyid);
          260   if (err == 0)
          261     err = write_pubkey(pub, k, keyid);
          262   RSA_free(k);
          263   return (err);
          264 }
          265 
          266 int check_pubkey(BUFFER *buf, const byte id[])
          267 {
          268   RSA *tmp;
          269   int ret;
          270 
          271   tmp = RSA_new();
          272   ret = read_pubkey(buf, tmp, id);
          273   RSA_free(tmp);
          274   return (ret);
          275 }
          276 
          277 int check_seckey(BUFFER *buf, const byte id[])
          278 {
          279   RSA *tmp;
          280   int ret;
          281 
          282   tmp = RSA_new();
          283   ret = read_seckey(buf, tmp, id);
          284   RSA_free(tmp);
          285   return (ret);
          286 }
          287 
          288 int v2createkey(void)
          289 {
          290   RSA *k;
          291   BUFFER *b, *ek, *iv;
          292   int err;
          293   FILE *f;
          294   byte keyid[16];
          295   char line[33];
          296 
          297   b = buf_new();
          298   ek = buf_new();
          299   iv = buf_new();
          300 
          301   errlog(NOTICE, "Generating RSA key.\n");
          302   k = RSA_generate_key(1024, 65537, NULL, NULL);
          303   err = write_seckey(b, k, keyid);
          304   RSA_free(k);
          305   if (err == 0) {
          306     f = mix_openfile(SECRING, "a");
          307     if (f != NULL) {
          308       time_t now = time(NULL);
          309       struct tm *gt;
          310       gt = gmtime(&now);
          311       strftime(line, LINELEN, "%Y-%m-%d", gt);
          312       fprintf(f, "%s\nCreated: %s\n", begin_key, line);
          313       if (KEYLIFETIME) {
          314         now += KEYLIFETIME;
          315         gt = gmtime(&now);
          316         strftime(line, LINELEN, "%Y-%m-%d", gt);
          317         fprintf(f, "Expires: %s\n", line);
          318       }
          319       id_encode(keyid, line);
          320       buf_appends(ek, PASSPHRASE);
          321       digest_md5(ek, ek);
          322       buf_setrnd(iv, 8);
          323       buf_crypt(b, ek, iv, ENCRYPT);
          324       encode(b, 40);
          325       encode(iv, 0);
          326       fprintf(f, "%s\n0\n%s\n", line, iv->data);
          327       buf_write(b, f);
          328       fprintf(f, "%s\n\n", end_key);
          329       fclose(f);
          330     } else
          331       err = -1;
          332   }
          333   if (err != 0)
          334     errlog(ERRORMSG, "Key generation failed.\n");
          335 
          336   buf_free(b);
          337   buf_free(ek);
          338   buf_free(iv);
          339   return (err);
          340 }
          341 
          342 int pk_decrypt(BUFFER *in, BUFFER *keybuf)
          343 {
          344   int err = 0;
          345   BUFFER *out;
          346   RSA *key;
          347 
          348   out = buf_new();
          349   key = RSA_new();
          350   read_seckey(keybuf, key, NULL);
          351 
          352   buf_prepare(out, in->length);
          353   out->length = RSA_private_decrypt(in->length, in->data, out->data, key,
          354                                     RSA_PKCS1_PADDING);
          355   if (out->length == -1)
          356     err = -1, out->length = 0;
          357 
          358   RSA_free(key);
          359   buf_move(in, out);
          360   buf_free(out);
          361   return (err);
          362 }
          363 
          364 int pk_encrypt(BUFFER *in, BUFFER *keybuf)
          365 {
          366   BUFFER *out;
          367   RSA *key;
          368   int err = 0;
          369 
          370   out = buf_new();
          371   key = RSA_new();
          372   read_pubkey(keybuf, key, NULL);
          373 
          374   buf_prepare(out, RSA_size(key));
          375   out->length = RSA_public_encrypt(in->length, in->data, out->data, key,
          376                                    RSA_PKCS1_PADDING);
          377   if (out->length == -1)
          378     out->length = 0, err = -1;
          379   buf_move(in, out);
          380   buf_free(out);
          381   RSA_free(key);
          382   return (err);
          383 }
          384 int buf_crypt(BUFFER *buf, BUFFER *key, BUFFER *iv, int enc)
          385 {
          386   DES_key_schedule ks1;
          387   DES_key_schedule ks2;
          388   DES_key_schedule ks3;
          389   DES_cblock i;
          390 
          391   assert(enc == ENCRYPT || enc == DECRYPT);
          392   assert((key->length == 16 || key->length == 24) && iv->length == 8);
          393   assert(buf->length % 8 == 0);
          394 
          395   memcpy(i, iv->data, 8);        /* leave iv buffer unchanged */
          396   DES_set_key((const_DES_cblock *) key->data, &ks1);
          397   DES_set_key((const_DES_cblock *) (key->data + 8), &ks2);
          398   if (key->length == 16)
          399     DES_set_key((const_DES_cblock *) key->data, &ks3);
          400   else
          401     DES_set_key((const_DES_cblock *) (key->data + 16), &ks3);
          402   DES_ede3_cbc_encrypt(buf->data, buf->data, buf->length, &ks1, &ks2, &ks3,
          403                        &i, enc);
          404   return (0);
          405 }
          406 
          407 int buf_3descrypt(BUFFER *buf, BUFFER *key, BUFFER *iv, int enc)
          408 {
          409   int n = 0;
          410   DES_key_schedule ks1;
          411   DES_key_schedule ks2;
          412   DES_key_schedule ks3;
          413 
          414   assert(enc == ENCRYPT || enc == DECRYPT);
          415   assert(key->length == 24 && iv->length == 8);
          416 
          417   DES_set_key((const_DES_cblock *) key->data, &ks1);
          418   DES_set_key((const_DES_cblock *) (key->data + 8), &ks2);
          419   DES_set_key((const_DES_cblock *) (key->data + 16), &ks3);
          420   DES_ede3_cfb64_encrypt(buf->data, buf->data, buf->length, &ks1, &ks2, &ks3,
          421                         (DES_cblock *) iv->data, &n, enc);
          422   return (0);
          423 }
          424 
          425 int buf_bfcrypt(BUFFER *buf, BUFFER *key, BUFFER *iv, int enc)
          426 {
          427   int n = 0;
          428   BF_KEY ks;
          429 
          430   if (key == NULL || key->length == 0)
          431     return (-1);
          432 
          433   assert(enc == ENCRYPT || enc == DECRYPT);
          434   assert(key->length == 16 && iv->length == 8);
          435   BF_set_key(&ks, key->length, key->data);
          436   BF_cfb64_encrypt(buf->data, buf->data, buf->length, &ks, iv->data, &n,
          437                      enc == ENCRYPT ? BF_ENCRYPT : BF_DECRYPT);
          438   return (0);
          439 }
          440 
          441 int buf_castcrypt(BUFFER *buf, BUFFER *key, BUFFER *iv, int enc)
          442 {
          443   int n = 0;
          444   CAST_KEY ks;
          445 
          446   if (key == NULL || key->length == 0)
          447     return (-1);
          448 
          449   assert(enc == ENCRYPT || enc == DECRYPT);
          450   assert(key->length == 16 && iv->length == 8);
          451   CAST_set_key(&ks, 16, key->data);
          452   CAST_cfb64_encrypt(buf->data, buf->data, buf->length, &ks, iv->data, &n,
          453                      enc == ENCRYPT ? CAST_ENCRYPT : CAST_DECRYPT);
          454   return (0);
          455 }
          456 
          457 #ifdef USE_AES
          458 int buf_aescrypt(BUFFER *buf, BUFFER *key, BUFFER *iv, int enc)
          459 {
          460   int n = 0;
          461   AES_KEY ks;
          462 
          463   if (key == NULL || key->length == 0)
          464     return (-1);
          465 
          466   assert(enc == ENCRYPT || enc == DECRYPT);
          467   assert((key->length == 16 || key->length == 24 || key->length == 32) && iv->length == 16);
          468   AES_set_encrypt_key(key->data, key->length<<3, &ks);
          469   AES_cfb128_encrypt(buf->data, buf->data, buf->length, &ks, iv->data, &n,
          470                      enc == ENCRYPT ? AES_ENCRYPT : AES_DECRYPT);
          471   return (0);
          472 }
          473 #endif /* USE_AES */
          474 
          475 #ifdef USE_IDEA
          476 int buf_ideacrypt(BUFFER *buf, BUFFER *key, BUFFER *iv, int enc)
          477 {
          478   int n = 0;
          479   IDEA_KEY_SCHEDULE ks;
          480 
          481   if (key == NULL || key->length == 0)
          482     return (-1);
          483 
          484   assert(enc == ENCRYPT || enc == DECRYPT);
          485   assert(key->length == 16 && iv->length == 8);
          486   idea_set_encrypt_key(key->data, &ks);
          487   idea_cfb64_encrypt(buf->data, buf->data, buf->length, &ks, iv->data, &n,
          488                      enc == ENCRYPT ? IDEA_ENCRYPT : IDEA_DECRYPT);
          489   return (0);
          490 }
          491 #endif /* USE_IDEA */
          492 #endif /* USE_OPENSSL */