?? rdemo.c
字號:
*/static int GetPrivateKey (privateKey)R_RSA_PRIVATE_KEY **privateKey;{ char command[80]; while (1) { if (!KEYPAIR3_READY) GetCommand (command, sizeof (command), " Public key 1 or 2?"); else GetCommand (command, sizeof (command), " Public key 1, 2 or 3?"); switch (*command) { case '\0': return (1); case '1': *privateKey = &PRIVATE_KEY1; return (0); case '2': *privateKey = &PRIVATE_KEY2; return (0); case '3': if (!KEYPAIR3_READY) break; *privateKey = &PRIVATE_KEY3; return (0); default: if (KEYPAIR3_READY) PrintError ("ERROR: Please enter 1, 2 or 3. Try again.", 0); else PrintError ("ERROR: Please enter 1 or 2. Try again.", 0); break; } }}/* Ask the user to use MD2 or MD5 and point digestAlgorithm to the answer. Return 0 on success or 1 if user cancels by entering a blank. */static int GetDigestAlgorithm (digestAlgorithm)int *digestAlgorithm;{ char command[80]; while (1) { GetCommand (command, sizeof (command), " MD2 or MD5 (2 or 5)?"); switch (*command) { case '\0': return (1); case '2': *digestAlgorithm = DA_MD2; return (0); case '5': *digestAlgorithm = DA_MD5; return (0); default: PrintError ("ERROR: Please enter 2 or 5. Try again.", 0); break; } }}/* Ask the user to use DES, DESX, DES-EDE2, or DES-EDE3, and point encryptionAlgorithm to the answer. Return 0 on success or 1 if user cancels by entering a blank. */static int GetEncryptionAlgorithm (encryptionAlgorithm)int *encryptionAlgorithm;{ char command[80]; while (1) { GetCommand (command, sizeof (command), " DES, DESX, DES-EDE2 or DES-EDE3 (1, X, 2 or 3)?"); switch (*command) { case '\0': return (1); case '1': *encryptionAlgorithm = EA_DES_CBC; return (0); case 'x': case 'X': *encryptionAlgorithm = EA_DESX_CBC; return (0); case '2': *encryptionAlgorithm = EA_DES_EDE2_CBC; return (0); case '3': *encryptionAlgorithm = EA_DES_EDE3_CBC; return (0); default: PrintError ("ERROR: Please enter 1, X, 2 or 3. Try again.", 0); break; } }}/* Ask for the filename using the given prompt string and open it for reading. Return 0 on success or 1 if error or if user cancels by entering a blank. */static int ReadInit (file, prompt) FILE **file;char *prompt;{ char filename[256]; while (1) { GetCommand (filename, sizeof (filename), prompt); if (! *filename) return (1); if ((*file = fopen (filename, "rb")) != NULL) /* successfully opened */ break; PrintError ("ERROR: Cannot open a file with that name. Try again.", 0); } return (0);}/* Read a block of up to length maxPartOutLen bytes from file, storing it in partOut and returning its length in partOutLen. Return 0 on success or 1 if error or end of file. */static int ReadUpdate (file, partOut, partOutLen, maxPartOutLen)FILE *file;unsigned char *partOut;unsigned int *partOutLen;unsigned int maxPartOutLen;{ int status; /* fread () returns the number of items read in. */ *partOutLen = fread (partOut, 1, maxPartOutLen, file); status = 0; if (ferror (file)) { PrintError ("ERROR: Cannot read file.", 0); status = 1; } if (*partOutLen == 0 && feof (file)) status = 1; return (status);}/* Close file. */static void ReadFinal (file)FILE *file;{ fclose (file);}/* Read a file of up to length maxBlockLen bytes, storing it in block and returning its length in blockLen. Ask for the filename using the given prompt string. Return 0 on success or 1 if error or if user cancels by entering a blank. */static int ReadBlock (block, blockLen, maxBlockLen, prompt) unsigned char *block;unsigned int *blockLen;unsigned int maxBlockLen;char *prompt;{ FILE *file; int status; unsigned char *dummy; unsigned int dummyLen; if (ReadInit (&file, prompt)) return (1); if ((status = ReadUpdate (file, block, blockLen, maxBlockLen)) == 0) { if (*blockLen == maxBlockLen) /* Read exactly maxBlockLen bytes, so reading one more will set end of file if there were exactly maxBlockLen bytes in the file. */ if (!ReadUpdate (file, dummy, &dummyLen, 1)) { PrintError ("ERROR: File is too large.", 0); status = 1; } } ReadFinal (file); return (status);}/* Ask for the filename using the given prompt string and open it for writing. Return 0 on success or 1 if error or if user cancels by entering a blank. */static int WriteInit (file, prompt) FILE **file;char *prompt;{ char filename[256]; while (1) { GetCommand (filename, sizeof (filename), prompt); if (! *filename) return (1); if (filename[0] == '-' && filename[1] == '\0') { /* use stdout */ *file = stdout; break; } if ((*file = fopen (filename, "wb")) != NULL) /* successfully opened */ break; PrintError ("ERROR: Cannot open a file with that name. Try again.", 0); } return (0);}/* Write block of length partOutLen to a file. Return 0 on success or 1 if error. */static int WriteUpdate (file, partOut, partOutLen)FILE *file;unsigned char *partOut;unsigned int partOutLen;{ int status; status = 0; if (fwrite (partOut, 1, partOutLen, file) < partOutLen) { PrintError ("ERROR: Cannot write file.", 0); status = 1; } return (status);}/* Close file. */static void WriteFinal (file)FILE *file;{ if (file != stdout) fclose (file);}/* Write block of length blockLen to a file. Ask for the filename using the given prompt string. Return 0 on success or 1 if error or if user cancels by entering a blank. */static int WriteBlock (block, blockLen, prompt) unsigned char *block;unsigned int blockLen;char *prompt;{ FILE *file; int status; if (WriteInit (&file, prompt)) return (1); do { if ((status = WriteUpdate (file, block, blockLen)) != 0) break; if (file == stdout) /* Printing to screen, so print a new line. */ printf ("\n"); } while (0); WriteFinal (file); return (status);}static void PrintMessage (message)char *message;{ if (!SILENT_PROMPT) { puts (message); fflush (stdout); }}/* If type is zero, simply print the task string, otherwise convert the type to a string and print task and type. */static void PrintError (task, type)char *task;int type;{ char *typeString, buf[80]; if (type == 0) { puts (task); return; } /* Convert the type to a string if it is recognized. */ switch (type) { case RE_KEY: typeString = "Recovered DES key cannot decrypt encrypted content"; break; case RE_LEN: typeString = "Encrypted key length or signature length is out of range"; break; case RE_MODULUS_LEN: typeString = "Modulus length is out of range"; break; case RE_PRIVATE_KEY: typeString = "Private key cannot encrypt message digest, or cannot decrypt encrypted key"; break; case RE_PUBLIC_KEY: typeString = "Public key cannot encrypt data encryption key, or cannot decrypt signature"; break; case RE_SIGNATURE: typeString = "Signature is incorrect"; break; default: sprintf (buf, "Code 0x%04x", type); typeString = buf; } printf ("ERROR: %s while %s\n", typeString, task); fflush (stdout);}static void GetCommand (command, maxCommandSize, prompt)char *command;unsigned int maxCommandSize;char *prompt;{ unsigned int i; if (!SILENT_PROMPT) { printf ("%s (blank to cancel): \n", prompt); fflush (stdout); } fgets (command, maxCommandSize, stdin); /* Replace the line terminator with a '\0'. */ for (i = 0; command[i] != '\0'; i++) { if (command[i] == '\012' || command[i] == '\015' || i == (maxCommandSize - 1)) { command[i] = '\0'; return; } }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -