aboutsummaryrefslogtreecommitdiffstats
path: root/libtests/rc4.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libtests/rc4.cc')
-rw-r--r--libtests/rc4.cc82
1 files changed, 82 insertions, 0 deletions
diff --git a/libtests/rc4.cc b/libtests/rc4.cc
new file mode 100644
index 00000000..34d779ad
--- /dev/null
+++ b/libtests/rc4.cc
@@ -0,0 +1,82 @@
+
+#include <qpdf/Pl_RC4.hh>
+#include <qpdf/Pl_StdioFile.hh>
+
+#include <stdio.h>
+#include <string.h>
+#include <iostream>
+#include <stdlib.h>
+
+#ifdef _WIN32
+# include <io.h>
+#else
+# include <unistd.h>
+#endif
+
+int main(int argc, char* argv[])
+{
+ if (argc != 4)
+ {
+ std::cerr << "Usage: rc4 hex-key infile outfile" << std::endl;
+ exit(2);
+ }
+
+ char* hexkey = argv[1];
+ char* infilename = argv[2];
+ char* outfilename = argv[3];
+ int hexkeylen = strlen(hexkey);
+ int keylen = hexkeylen / 2;
+ unsigned char* key = new unsigned char[keylen + 1];
+ key[keylen] = '\0';
+
+ FILE* infile = fopen(infilename, "rb");
+ if (infile == 0)
+ {
+ std::cerr << "can't open " << infilename << std::endl;
+ exit(2);
+ }
+
+ for (unsigned int i = 0; i < strlen(hexkey); i += 2)
+ {
+ char t[3];
+ t[0] = hexkey[i];
+ t[1] = hexkey[i + 1];
+ t[2] = '\0';
+
+ long val = strtol(t, 0, 16);
+ key[i/2] = (unsigned char) val;
+ }
+
+ FILE* outfile = fopen(outfilename, "wb");
+ if (outfile == 0)
+ {
+ std::cerr << "can't open " << outfilename << std::endl;
+ exit(2);
+ }
+ Pl_StdioFile* out = new Pl_StdioFile("stdout", outfile);
+ // Use a small buffer size (64) for testing
+ Pl_RC4* rc4 = new Pl_RC4("rc4", out, key, keylen, 64);
+ delete [] key;
+
+ // 64 < buffer size < 512, buffer_size is not a power of 2 for testing
+ unsigned char buf[100];
+ bool done = false;
+ while (! done)
+ {
+ int len = fread(buf, 1, sizeof(buf), infile);
+ if (len <= 0)
+ {
+ done = true;
+ }
+ else
+ {
+ rc4->write(buf, len);
+ }
+ }
+ rc4->finish();
+ delete rc4;
+ delete out;
+ fclose(infile);
+ fclose(outfile);
+ return 0;
+}