/* * Write out a file of random bytes. If cfb is defined, wash it with the * cipher. */ int cryptRandWriteFile(char const *name, struct IdeaCfbContext *cfb, unsigned bytes) { byte buf[256]; FILE *f; int i, len; f = fopen(name, FOPWBIN); if (!f) return -1; while (bytes) { len = (bytes < sizeof(buf)) ? bytes : sizeof(buf); for (i = 0; i < len; i++) buf[i] = ideaRandByte(&randContext); if (cfb) ideaCfbEncrypt(cfb, buf, buf, len); i = fwrite(buf, 1, len, f); if (i < len) break; bytes -= len; } #ifdef MACTC5 PGPSetFinfo((char *)name,'RSed','MPGP'); #endif return (fclose(f) != 0 || bytes != 0) ? -1 : 0; }
/* * Load the RNG state from the randseed.bin file on disk. * Returns 0 on success, <0 on error. * * If cfb is non-zero, prewashes the data by encrypting with it. */ int cryptRandOpen(struct IdeaCfbContext *cfb) { byte buf[256]; int len; FILE *f; if (randSeedOpen) return 0; /* Already open */ f = fopen(globalRandseedName, FOPRBIN); if (!f) return -1; /* First get the bare minimum 24 bytes we need for the IDEA RNG */ len = fread((char *)buf, 1, 24, f); if (cfb) ideaCfbEncrypt(cfb, buf, buf, 24); ideaRandInit(&randContext, buf, buf+16); randSeedOpen = TRUE; if (len != 24) { /* Error */ fclose(f); return -1; } /* Read any extra into the random pool */ for (;;) { len = fread((char *)buf, 1, sizeof(buf), f); if (len <= 0) break; if (cfb) ideaCfbEncrypt(cfb, buf, buf, len); randPoolAddBytes(buf, len); } fclose(f); burn(buf); #ifdef MACTC5 PGPSetFinfo(globalRandseedName,'RSed','MPGP'); #endif return 0; }
/* Create a new state from the output of trueRandByte */ void cryptRandInit(struct IdeaCfbContext *cfb) { byte buf[24]; int i; for (i = 0; i < sizeof(buf); i++) buf[i] = trueRandByte(); if (cfb) ideaCfbEncrypt(cfb, buf, buf, sizeof(buf)); ideaRandInit(&randContext, buf, buf+16); randSeedOpen = TRUE; burn(buf); }
int crypt_file (char *source, char *dest) { int i; int count = 8; /* block size */ char fPath[_MAX_PATH]; char sDrive[_MAX_DRIVE]; char sDir[_MAX_DIR]; char sFname[_MAX_FNAME]; char sExt[_MAX_EXT]; char buffer[8]; char cbc[8]; char fcbc[8]; char seed[8]; char *path; FILE *infile; FILE *outfile; while (!key_defined) crypt_key (KEY_IMMEDIATE, "?"); if ((infile = fopen (source, "rb")) == NULL) { fprintf (stderr, "Can not open %s for reading.\n", source); return 1; } if ((outfile = fopen (dest, "wb")) == NULL) { fprintf (stderr, "Can not open %s for writing.\n", dest); fclose (infile); return 1; } if (encrypt_or_decrypt == ENCRYPTION_SELECT) strcpy(fPath, source); else strcpy(fPath, dest); path = _fullpath(NULL, fPath, 0); _splitpath( path, sDrive, sDir, sFname, sExt ); free(path); for (i = 0; i < 8; i++) { buffer[i] = (char) 0x20; /* text files padded with spaces */ cbc[i] = fcbc[i] = seed[i] = '\0'; /* constant initialization vector */ } for (i=0; i < 8; i++) /* copy up to 8 letters from simple file name */ { if (sFname[i] == '\0') break; cbc[i] = fcbc[i] = toupper(sFname[i]); } while (count = fread (buffer, sizeof (char), count, infile)) { if (encrypt_or_decrypt == ENCRYPTION_SELECT) { for (i=0; i<8; i++) buffer[i] ^= cbc[i]; if (count == 8) ideaCfbEncrypt(&cfb, buffer, buffer, 8); else { ideaCfbEncrypt(&cfb, cbc, seed, 8); for (i=0; i<8; i++) buffer[i] ^= seed[i]; } for (i=0; i<8; i++) cbc[i] = buffer[i]; } else { for (i=0; i<8; i++) cbc[i] = buffer[i]; if (count == 8) ideaCfbDecrypt(&cfb, buffer, buffer, 8); else { ideaCfbEncrypt(&cfb, fcbc, seed, 8); for (i=0; i<8; i++) buffer[i] ^= seed[i]; } for (i=0; i<8; i++) { buffer[i] ^= fcbc[i]; fcbc[i] = cbc[i]; } } if (count != fwrite (buffer, sizeof (char), count, outfile)) { fprintf (stderr, "Could not write to %s\n", source); fclose (infile); fclose (outfile); return 1; } else { for (i = 0; i < 8; i++) buffer[i] = (char) 0x20; } } for (i=0; i<8; i++) cbc[i] = fcbc[i] = seed[i] = '\0'; fclose (infile); fclose (outfile); return 0; }