Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Firefox/security/nss/cmd/symkeyutil/   (Browser von der Mozilla Stiftung Version 136.0.1©)  Datei vom 10.2.2025 mit Größe 35 kB image not shown  

Quelle  symkeyutil.c   Sprache: C

 
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */


/*
** symkeyutil.c
**
** utility for managing symetric keys in the database or the token
**
*/


/*
 * Wish List for this utility:
 *  1) Display and Set the CKA_ operation flags for the key.
 *  2) Modify existing keys
 *  3) Copy keys
 *  4) Read CKA_ID and display for keys.
 *  5) Option to store CKA_ID in a file on key creation.
 *  6) Encrypt, Decrypt, Hash, and Mac with generated keys.
 *  7) Use asymetric keys to wrap and unwrap keys.
 *  8) Derive.
 *  9) PBE keys.
 */


#include <stdio.h>
#include <string.h>

#include "secutil.h"

#include "nspr.h"

#include "pk11func.h"
#include "secasn1.h"
#include "cert.h"
#include "cryptohi.h"
#include "secoid.h"
#include "certdb.h"
#include "nss.h"

typedef struct _KeyTypes {
    CK_KEY_TYPE keyType;
    CK_MECHANISM_TYPE mechType;
    CK_MECHANISM_TYPE wrapMech;
    char *label;
} KeyTypes;

static KeyTypes keyArray[] = {
#ifdef RECOGNIZE_ASYMETRIC_TYPES
    { CKK_RSA, CKM_RSA_PKCS, CKM_RSA_PKCS, "rsa" },
    { CKK_DSA, CKM_DSA, CKM_INVALID_MECHANISM, "dsa" },
    { CKK_DH, CKM_DH_PKCS_DERIVE, CKM_INVALID_MECHANISM, "dh" },
    { CKK_EC, CKM_ECDSA, CKM_INVALID_MECHANISM, "ec" },
    { CKK_X9_42_DH, CKM_X9_42_DH_DERIVE, CKM_INVALID_MECHANISM, "x9.42dh" },
    { CKK_KEA, CKM_KEA_KEY_DERIVE, CKM_INVALID_MECHANISM, "kea" },
#endif
    { CKK_GENERIC_SECRET, CKM_SHA_1_HMAC, CKM_INVALID_MECHANISM, "generic" },
    { CKK_RC2, CKM_RC2_CBC, CKM_RC2_ECB, "rc2" },
    /* don't define a wrap mech for RC-4 since it's note really safe */
    { CKK_RC4, CKM_RC4, CKM_INVALID_MECHANISM, "rc4" },
    { CKK_DES, CKM_DES_CBC, CKM_DES_ECB, "des" },
    { CKK_DES2, CKM_DES2_KEY_GEN, CKM_DES3_ECB, "des2" },
    { CKK_DES3, CKM_DES3_KEY_GEN, CKM_DES3_ECB, "des3" },
    { CKK_CAST, CKM_CAST_CBC, CKM_CAST_ECB, "cast" },
    { CKK_CAST3, CKM_CAST3_CBC, CKM_CAST3_ECB, "cast3" },
    { CKK_CAST5, CKM_CAST5_CBC, CKM_CAST5_ECB, "cast5" },
    { CKK_CAST128, CKM_CAST128_CBC, CKM_CAST128_ECB, "cast128" },
    { CKK_RC5, CKM_RC5_CBC, CKM_RC5_ECB, "rc5" },
    { CKK_IDEA, CKM_IDEA_CBC, CKM_IDEA_ECB, "idea" },
    { CKK_SKIPJACK, CKM_SKIPJACK_CBC64, CKM_SKIPJACK_WRAP, "skipjack" },
    { CKK_BATON, CKM_BATON_CBC128, CKM_BATON_WRAP, "baton" },
    { CKK_JUNIPER, CKM_JUNIPER_CBC128, CKM_JUNIPER_WRAP, "juniper" },
    { CKK_CDMF, CKM_CDMF_CBC, CKM_CDMF_ECB, "cdmf" },
    { CKK_AES, CKM_AES_CBC, CKM_AES_ECB, "aes" },
    { CKK_CAMELLIA, CKM_CAMELLIA_CBC, CKM_CAMELLIA_ECB, "camellia" },
};

static int keyArraySize = sizeof(keyArray) / sizeof(keyArray[0]);

int
GetLen(PRFileDesc *fd)
{
    PRFileInfo info;

    if (PR_SUCCESS != PR_GetOpenFileInfo(fd, &info)) {
        return -1;
    }

    return info.size;
}

int
ReadBuf(char *inFile, SECItem *item)
{
    int len;
    int ret;
    PRFileDesc *fd = PR_Open(inFile, PR_RDONLY, 0);
    if (NULL == fd) {
        SECU_PrintError("symkeyutil""PR_Open failed");
        return -1;
    }

    len = GetLen(fd);
    if (len < 0) {
        SECU_PrintError("symkeyutil""PR_GetOpenFileInfo failed");
        return -1;
    }
    item->data = (unsigned char *)PORT_Alloc(len);
    if (item->data == NULL) {
        fprintf(stderr, "Failed to allocate %d to read file %s\n", len, inFile);
        return -1;
    }

    ret = PR_Read(fd, item->data, item->len);
    if (ret < 0) {
        SECU_PrintError("symkeyutil""PR_Read failed");
        PORT_Free(item->data);
        item->data = NULL;
        return -1;
    }
    PR_Close(fd);
    item->len = len;
    return 0;
}

int
WriteBuf(char *inFile, SECItem *item)
{
    int ret;
    PRFileDesc *fd = PR_Open(inFile, PR_WRONLY | PR_CREATE_FILE, 0x200);
    if (NULL == fd) {
        SECU_PrintError("symkeyutil""PR_Open failed");
        return -1;
    }

    ret = PR_Write(fd, item->data, item->len);
    if (ret < 0) {
        SECU_PrintError("symkeyutil""PR_Write failed");
        return -1;
    }
    PR_Close(fd);
    return 0;
}

CK_KEY_TYPE
GetKeyTypeFromString(const char *keyString)
{
    int i;
    for (i = 0; i < keyArraySize; i++) {
        if (PL_strcasecmp(keyString, keyArray[i].label) == 0) {
            return keyArray[i].keyType;
        }
    }
    return (CK_KEY_TYPE)-1;
}

CK_MECHANISM_TYPE
GetKeyMechFromString(const char *keyString)
{
    int i;
    for (i = 0; i < keyArraySize; i++) {
        if (PL_strcasecmp(keyString, keyArray[i].label) == 0) {
            return keyArray[i].mechType;
        }
    }
    return (CK_MECHANISM_TYPE)-1;
}

const char *
GetStringFromKeyType(CK_KEY_TYPE type)
{
    int i;
    for (i = 0; i < keyArraySize; i++) {
        if (keyArray[i].keyType == type) {
            return keyArray[i].label;
        }
    }
    return "unmatched";
}

CK_MECHANISM_TYPE
GetWrapFromKeyType(CK_KEY_TYPE type)
{
    int i;
    for (i = 0; i < keyArraySize; i++) {
        if (keyArray[i].keyType == type) {
            return keyArray[i].wrapMech;
        }
    }
    return CKM_INVALID_MECHANISM;
}

CK_MECHANISM_TYPE
GetWrapMechanism(PK11SymKey *symKey)
{
    CK_KEY_TYPE type = PK11_GetSymKeyType(symKey);

    return GetWrapFromKeyType(type);
}

int
GetDigit(char c)
{
    if (c == 0) {
        return -1;
    }
    if (c <= '9' && c >= '0') {
        return c - '0';
    }
    if (c <= 'f' && c >= 'a') {
        return c - 'a' + 0xa;
    }
    if (c <= 'F' && c >= 'A') {
        return c - 'A' + 0xa;
    }
    return -1;
}

char
ToDigit(unsigned char c)
{
    c = c & 0xf;
    if (c <= 9) {
        return (char)(c + '0');
    }
    return (char)(c + 'a' - 0xa);
}

char *
BufToHex(SECItem *outbuf)
{
    int len = outbuf->len * 2 + 1;
    char *string, *ptr;
    unsigned int i;

    string = PORT_Alloc(len);
    if (!string) {
        return NULL;
    }

    ptr = string;
    for (i = 0; i < outbuf->len; i++) {
        *ptr++ = ToDigit(outbuf->data[i] >> 4);
        *ptr++ = ToDigit(outbuf->data[i] & 0xf);
    }
    *ptr = 0;
    return string;
}

int
HexToBuf(char *inString, SECItem *outbuf)
{
    int len = strlen(inString);
    int outlen = len + 1 / 2;
    int trueLen = 0;

    outbuf->data = PORT_Alloc(outlen);
    if (!outbuf->data) {
        return -1;
    }

    while (*inString) {
        int digit1, digit2;
        digit1 = GetDigit(*inString++);
        digit2 = GetDigit(*inString++);
        if ((digit1 == -1) || (digit2 == -1)) {
            PORT_Free(outbuf->data);
            outbuf->data = NULL;
            return -1;
        }
        outbuf->data[trueLen++] = digit1 << 4 | digit2;
    }
    outbuf->len = trueLen;
    return 0;
}

void
printBuf(unsigned char *data, int len)
{
    int i;

    for (i = 0; i < len; i++) {
        printf("%02x", data[i]);
    }
}

void
PrintKey(PK11SymKey *symKey)
{
    char *name = PK11_GetSymKeyNickname(symKey);
    int len = PK11_GetKeyLength(symKey);
    int strength = PK11_GetKeyStrength(symKey, NULL);
    SECItem *value = NULL;
    CK_KEY_TYPE type = PK11_GetSymKeyType(symKey);
    (void)PK11_ExtractKeyValue(symKey);

    value = PK11_GetKeyData(symKey);

    printf("%-20s %3d %4d %10s ", name ? name : " ", len, strength,
           GetStringFromKeyType(type));
    if (value && value->data) {
        printBuf(value->data, value->len);
    } else {
        printf("");
    }
    printf("\n");
    PORT_Free(name);
}

SECStatus
ListKeys(PK11SlotInfo *slot, int *printLabel, void *pwd)
{
    PK11SymKey *keyList;
    SECStatus rv = PK11_Authenticate(slot, PR_FALSE, pwd);
    if (rv != SECSuccess) {
        return rv;
        ;
    }

    keyList = PK11_ListFixedKeysInSlot(slot, NULL, pwd);
    if (keyList) {
        if (*printLabel) {
            printf(" Name Len Strength Type Data\n");
            *printLabel = 0;
        }
        printf("%s:\n", PK11_GetTokenName(slot));
    }
    while (keyList) {
        PK11SymKey *freeKey = keyList;
        PrintKey(keyList);
        keyList = PK11_GetNextSymKey(keyList);
        PK11_FreeSymKey(freeKey);
    }
    return SECSuccess;
}

PK11SymKey *
FindKey(PK11SlotInfo *slot, char *name, SECItem *id, void *pwd)
{
    PK11SymKey *key = NULL;
    SECStatus rv = PK11_Authenticate(slot, PR_FALSE, pwd);

    if (rv != SECSuccess) {
        return NULL;
    }

    if (id->data) {
        key = PK11_FindFixedKey(slot, CKM_INVALID_MECHANISM, id, pwd);
    }
    if (name && !key) {
        key = PK11_ListFixedKeysInSlot(slot, name, pwd);
    }

    if (key) {
        printf("Found a key\n");
        PrintKey(key);
    }
    return key;
}

PRBool
IsKeyList(PK11SymKey *symKey)
{
    return (PRBool)(PK11_GetNextSymKey(symKey) != NULL);
}

void
FreeKeyList(PK11SymKey *symKey)
{
    PK11SymKey *next, *current;

    for (current = symKey; current; current = next) {
        next = PK11_GetNextSymKey(current);
        PK11_FreeSymKey(current);
    }
    return;
}

static void
Usage(char *progName)
{
#define FPS fprintf(stderr,
    FPS "Type %s -H for more detailed descriptions\n", progName);
    FPS "Usage:");
    FPS "\t%s -L [std_opts] [-r]\n", progName);
    FPS "\t%s -K [-n name] -t type [-s size] [-i id |-j id_file] [std_opts]\n", progName);
    FPS "\t%s -D <[-n name | -i id | -j id_file> [std_opts]\n", progName);
    FPS "\t%s -I [-n name] [-t type] [-i id | -j id_file] -k data_file [std_opts]\n"progName);
    FPS "\t%s -E <-nname | -i id | -j id_file> [-t type] -k data_file [-r] [std_opts]\n", progName);
    FPS "\t%s -U [-n name] [-t type] [-i id | -j id_file] -k data_file [std_opts]\n", progName);
    FPS "\t%s -W <-n name | -i id | -j id_file> [-t type] -k data_file [-r] [std_opts]\n", progName);
    FPS "\t%s -M <-n name | -i id | -j id_file> -g target_token [std_opts]\n", progName);
    FPS "\t\t std_opts -> [-d certdir] [-P dbprefix] [-p password] [-f passwordFile] [-h token]\n");
    FPS "\t\t wrap_opts -> <-w wrap_name | -x wrap_id | -y id_file>\n");
    exit(1);
}

static void
LongUsage(char *progName)
{
    int i;
    FPS "%-15s List all the keys.\n""-L");
    FPS "%-15s Generate a new key.\n""-K");
    FPS "%-20s Specify the nickname of the new key\n",
    " -n name");
    FPS "%-20s Specify the id in hex of the new key\n",
    " -i key id");
    FPS "%-20s Specify a file to read the id of the new key\n",
    " -j key id file");
    FPS "%-20s Specify the keyType of the new key\n",
    " -t type");
    FPS "%-20s"" valid types: ");
    for (i = 0; i < keyArraySize; i++) {
        FPS "%s%c", keyArray[i].label, i == keyArraySize-1? '\n':',');
    }
    FPS "%-20s Specify the size of the new key in bytes (required by some types)\n",
    " -s size");
    FPS "%-15s Delete a key.\n""-D");
    FPS "%-20s Specify the nickname of the key to delete\n",
    " -n name");
    FPS "%-20s Specify the id in hex of the key to delete\n",
    " -i key id");
    FPS "%-20s Specify a file to read the id of the key to delete\n",
    " -j key id file");
    FPS "%-15s Import a new key from a data file.\n""-I");
    FPS "%-20s Specify the data file to read the key from.\n",
    " -k key file");
    FPS "%-20s Specify the nickname of the new key\n",
    " -n name");
    FPS "%-20s Specify the id in hex of the new key\n",
    " -i key id");
    FPS "%-20s Specify a file to read the id of the new key\n",
    " -j key id file");
    FPS "%-20s Specify the keyType of the new key\n",
    " -t type");
    FPS "%-20s"" valid types: ");
    for (i = 0; i < keyArraySize; i++) {
        FPS "%s%c", keyArray[i].label, i == keyArraySize-1? '\n':',');
    }
    FPS "%-15s Export a key to a data file.\n""-E");
    FPS "%-20s Specify the data file to write the key to.\n",
    " -k key file");
    FPS "%-20s Specify the nickname of the key to export\n",
    " -n name");
    FPS "%-20s Specify the id in hex of the key to export\n",
    " -i key id");
    FPS "%-20s Specify a file to read the id of the key to export\n",
    " -j key id file");
    FPS "%-15s Move a key to a new token.\n""-M");
    FPS "%-20s Specify the nickname of the key to move\n",
    " -n name");
    FPS "%-20s Specify the id in hex of the key to move\n",
    " -i key id");
    FPS "%-20s Specify a file to read the id of the key to move\n",
    " -j key id file");
    FPS "%-20s Specify the token to move the key to\n",
    " -g target token");
    FPS "%-15s Unwrap a new key from a data file.\n""-U");
    FPS "%-20s Specify the data file to read the encrypted key from.\n",
    " -k key file");
    FPS "%-20s Specify the nickname of the new key\n",
    " -n name");
    FPS "%-20s Specify the id in hex of the new key\n",
    " -i key id");
    FPS "%-20s Specify a file to read the id of the new key\n",
    " -j key id file");
    FPS "%-20s Specify the keyType of the new key\n",
    " -t type");
    FPS "%-20s"" valid types: ");
    for (i = 0; i < keyArraySize; i++) {
        FPS "%s%c", keyArray[i].label, i == keyArraySize-1? '\n':',');
    }
    FPS "%-20s Specify the nickname of the wrapping key\n",
    " -w wrap name");
    FPS "%-20s Specify the id in hex of the wrapping key\n",
    " -x wrap key id");
    FPS "%-20s Specify a file to read the id of the wrapping key\n",
    " -y wrap key id file");
    FPS "%-15s Wrap a new key to a data file. [not yet implemented]\n""-W");
    FPS "%-20s Specify the data file to write the encrypted key to.\n",
    " -k key file");
    FPS "%-20s Specify the nickname of the key to wrap\n",
    " -n name");
    FPS "%-20s Specify the id in hex of the key to wrap\n",
    " -i key id");
    FPS "%-20s Specify a file to read the id of the key to wrap\n",
    " -j key id file");
    FPS "%-20s Specify the nickname of the wrapping key\n",
    " -w wrap name");
    FPS "%-20s Specify the id in hex of the wrapping key\n",
    " -x wrap key id");
    FPS "%-20s Specify a file to read the id of the wrapping key\n",
    " -y wrap key id file");
    FPS "%-15s Options valid for all commands\n""std_opts");
    FPS "%-20s The directory where the NSS db's reside\n",
    " -d certdir");
    FPS "%-20s Prefix for the NSS db's\n",
    " -P db prefix");
    FPS "%-20s Specify password on the command line\n",
    " -p password");
    FPS "%-20s Specify password file on the command line\n",
    " -f password file");
    FPS "%-20s Specify token to act on\n",
    " -h token");
    exit(1);
#undef FPS
}

/*  Certutil commands  */
enum {
    cmd_CreateNewKey = 0,
    cmd_DeleteKey,
    cmd_ImportKey,
    cmd_ExportKey,
    cmd_WrapKey,
    cmd_UnwrapKey,
    cmd_MoveKey,
    cmd_ListKeys,
    cmd_PrintHelp
};

/*  Certutil options */
enum {
    opt_CertDir = 0,
    opt_PasswordFile,
    opt_TargetToken,
    opt_TokenName,
    opt_KeyID,
    opt_KeyIDFile,
    opt_KeyType,
    opt_Nickname,
    opt_KeyFile,
    opt_Password,
    opt_dbPrefix,
    opt_RW,
    opt_KeySize,
    opt_WrapKeyName,
    opt_WrapKeyID,
    opt_WrapKeyIDFile,
    opt_NoiseFile
};

static secuCommandFlag symKeyUtil_commands[] = {
    { /* cmd_CreateNewKey        */ 'K', PR_FALSE, 0, PR_FALSE },
    { /* cmd_DeleteKey           */ 'D', PR_FALSE, 0, PR_FALSE },
    { /* cmd_ImportKey           */ 'I', PR_FALSE, 0, PR_FALSE },
    { /* cmd_ExportKey           */ 'E', PR_FALSE, 0, PR_FALSE },
    { /* cmd_WrapKey             */ 'W', PR_FALSE, 0, PR_FALSE },
    { /* cmd_UnwrapKey           */ 'U', PR_FALSE, 0, PR_FALSE },
    { /* cmd_MoveKey             */ 'M', PR_FALSE, 0, PR_FALSE },
    { /* cmd_ListKeys            */ 'L', PR_FALSE, 0, PR_FALSE },
    { /* cmd_PrintHelp           */ 'H', PR_FALSE, 0, PR_FALSE },
};

static secuCommandFlag symKeyUtil_options[] = {
    { /* opt_CertDir             */ 'd', PR_TRUE, 0, PR_FALSE },
    { /* opt_PasswordFile        */ 'f', PR_TRUE, 0, PR_FALSE },
    { /* opt_TargetToken         */ 'g', PR_TRUE, 0, PR_FALSE },
    { /* opt_TokenName           */ 'h', PR_TRUE, 0, PR_FALSE },
    { /* opt_KeyID               */ 'i', PR_TRUE, 0, PR_FALSE },
    { /* opt_KeyIDFile           */ 'j', PR_TRUE, 0, PR_FALSE },
    { /* opt_KeyType             */ 't', PR_TRUE, 0, PR_FALSE },
    { /* opt_Nickname            */ 'n', PR_TRUE, 0, PR_FALSE },
    { /* opt_KeyFile             */ 'k', PR_TRUE, 0, PR_FALSE },
    { /* opt_Password            */ 'p', PR_TRUE, 0, PR_FALSE },
    { /* opt_dbPrefix            */ 'P', PR_TRUE, 0, PR_FALSE },
    { /* opt_RW                  */ 'r', PR_FALSE, 0, PR_FALSE },
    { /* opt_KeySize             */ 's', PR_TRUE, 0, PR_FALSE },
    { /* opt_WrapKeyName         */ 'w', PR_TRUE, 0, PR_FALSE },
    { /* opt_WrapKeyID           */ 'x', PR_TRUE, 0, PR_FALSE },
    { /* opt_WrapKeyIDFile       */ 'y', PR_TRUE, 0, PR_FALSE },
    { /* opt_NoiseFile           */ 'z', PR_TRUE, 0, PR_FALSE },
};

int
main(int argc, char **argv)
{
    PK11SlotInfo *slot = NULL;
    char *slotname = "internal";
    char *certPrefix = "";
    CK_MECHANISM_TYPE keyType = CKM_SHA_1_HMAC;
    int keySize = 0;
    char *name = NULL;
    char *wrapName = NULL;
    secuPWData pwdata = { PW_NONE, 0 };
    PRBool readOnly = PR_FALSE;
    SECItem key;
    SECItem keyID;
    SECItem wrapKeyID;
    int commandsEntered = 0;
    int commandToRun = 0;
    char *progName;
    int i;
    SECStatus rv = SECFailure;

    secuCommand symKeyUtil;
    symKeyUtil.numCommands = sizeof(symKeyUtil_commands) / sizeof(secuCommandFlag);
    symKeyUtil.numOptions = sizeof(symKeyUtil_options) / sizeof(secuCommandFlag);
    symKeyUtil.commands = symKeyUtil_commands;
    symKeyUtil.options = symKeyUtil_options;

    key.data = NULL;
    key.len = 0;
    keyID.data = NULL;
    keyID.len = 0;
    wrapKeyID.data = NULL;
    wrapKeyID.len = 0;

    progName = strrchr(argv[0], '/');
    progName = progName ? progName + 1 : argv[0];

    rv = SECU_ParseCommandLine(argc, argv, progName, &symKeyUtil);

    if (rv != SECSuccess)
        Usage(progName);

    rv = SECFailure;

    /* -H print help */
    if (symKeyUtil.commands[cmd_PrintHelp].activated)
        LongUsage(progName);

    /* -f password file, -p password */
    if (symKeyUtil.options[opt_PasswordFile].arg) {
        pwdata.source = PW_FROMFILE;
        pwdata.data = symKeyUtil.options[opt_PasswordFile].arg;
    } else if (symKeyUtil.options[opt_Password].arg) {
        pwdata.source = PW_PLAINTEXT;
        pwdata.data = symKeyUtil.options[opt_Password].arg;
    }

    /* -d directory */
    if (symKeyUtil.options[opt_CertDir].activated)
        SECU_ConfigDirectory(symKeyUtil.options[opt_CertDir].arg);

    /* -s key size */
    if (symKeyUtil.options[opt_KeySize].activated) {
        keySize = PORT_Atoi(symKeyUtil.options[opt_KeySize].arg);
    }

    /*  -h specify token name  */
    if (symKeyUtil.options[opt_TokenName].activated) {
        if (PL_strcmp(symKeyUtil.options[opt_TokenName].arg, "all") == 0)
            slotname = NULL;
        else
            slotname = PL_strdup(symKeyUtil.options[opt_TokenName].arg);
    }

    /* -t key type */
    if (symKeyUtil.options[opt_KeyType].activated) {
        keyType = GetKeyMechFromString(symKeyUtil.options[opt_KeyType].arg);
        if (keyType == (CK_MECHANISM_TYPE)-1) {
            PR_fprintf(PR_STDERR,
                       "%s unknown key type (%s).\n",
                       progName, symKeyUtil.options[opt_KeyType].arg);
            return 255;
        }
    }

    /* -k for import and unwrap, it specifies an input file to read from,
     * for export and wrap it specifies an output file to write to */

    if (symKeyUtil.options[opt_KeyFile].activated) {
        if (symKeyUtil.commands[cmd_ImportKey].activated ||
            symKeyUtil.commands[cmd_UnwrapKey].activated) {
            int ret = ReadBuf(symKeyUtil.options[opt_KeyFile].arg, &key);
            if (ret < 0) {
                PR_fprintf(PR_STDERR,
                           "%s Couldn't read key file (%s).\n",
                           progName, symKeyUtil.options[opt_KeyFile].arg);
                return 255;
            }
        }
    }

    /* -i specify the key ID */
    if (symKeyUtil.options[opt_KeyID].activated) {
        int ret = HexToBuf(symKeyUtil.options[opt_KeyID].arg, &keyID);
        if (ret < 0) {
            PR_fprintf(PR_STDERR,
                       "%s invalid key ID (%s).\n",
                       progName, symKeyUtil.options[opt_KeyID].arg);
            return 255;
        }
    }

    /* -i & -j are mutually exclusive */
    if ((symKeyUtil.options[opt_KeyID].activated) &&
        (symKeyUtil.options[opt_KeyIDFile].activated)) {
        PR_fprintf(PR_STDERR,
                   "%s -i and -j options are mutually exclusive.\n", progName);
        return 255;
    }

    /* -x specify the Wrap key ID */
    if (symKeyUtil.options[opt_WrapKeyID].activated) {
        int ret = HexToBuf(symKeyUtil.options[opt_WrapKeyID].arg, &wrapKeyID);
        if (ret < 0) {
            PR_fprintf(PR_STDERR,
                       "%s invalid key ID (%s).\n",
                       progName, symKeyUtil.options[opt_WrapKeyID].arg);
            return 255;
        }
    }

    /* -x & -y are mutually exclusive */
    if ((symKeyUtil.options[opt_KeyID].activated) &&
        (symKeyUtil.options[opt_KeyIDFile].activated)) {
        PR_fprintf(PR_STDERR,
                   "%s -i and -j options are mutually exclusive.\n", progName);
        return 255;
    }

    /* -y specify the key ID */
    if (symKeyUtil.options[opt_WrapKeyIDFile].activated) {
        int ret = ReadBuf(symKeyUtil.options[opt_WrapKeyIDFile].arg,
                          &wrapKeyID);
        if (ret < 0) {
            PR_fprintf(PR_STDERR,
                       "%s Couldn't read key ID file (%s).\n",
                       progName, symKeyUtil.options[opt_WrapKeyIDFile].arg);
            return 255;
        }
    }

    /*  -P certdb name prefix */
    if (symKeyUtil.options[opt_dbPrefix].activated)
        certPrefix = symKeyUtil.options[opt_dbPrefix].arg;

    /*  Check number of commands entered.  */
    commandsEntered = 0;
    for (i = 0; i < symKeyUtil.numCommands; i++) {
        if (symKeyUtil.commands[i].activated) {
            commandToRun = symKeyUtil.commands[i].flag;
            commandsEntered++;
        }
        if (commandsEntered > 1)
            break;
    }
    if (commandsEntered > 1) {
        PR_fprintf(PR_STDERR, "%s: only one command at a time!\n", progName);
        PR_fprintf(PR_STDERR, "You entered: ");
        for (i = 0; i < symKeyUtil.numCommands; i++) {
            if (symKeyUtil.commands[i].activated)
                PR_fprintf(PR_STDERR, " -%c", symKeyUtil.commands[i].flag);
        }
        PR_fprintf(PR_STDERR, "\n");
        return 255;
    }
    if (commandsEntered == 0) {
        PR_fprintf(PR_STDERR, "%s: you must enter a command!\n", progName);
        Usage(progName);
    }

    if (symKeyUtil.commands[cmd_ListKeys].activated ||
        symKeyUtil.commands[cmd_PrintHelp].activated ||
        symKeyUtil.commands[cmd_ExportKey].activated ||
        symKeyUtil.commands[cmd_WrapKey].activated) {
        readOnly = !symKeyUtil.options[opt_RW].activated;
    }

    if ((symKeyUtil.commands[cmd_ImportKey].activated ||
         symKeyUtil.commands[cmd_ExportKey].activated ||
         symKeyUtil.commands[cmd_WrapKey].activated ||
         symKeyUtil.commands[cmd_UnwrapKey].activated) &&
        !symKeyUtil.options[opt_KeyFile].activated) {
        PR_fprintf(PR_STDERR,
                   "%s -%c: keyfile is required for this command (-k).\n",
                   progName, commandToRun);
        return 255;
    }

    /*  -E, -D, -W, and all require -n, -i, or -j to identify the key  */
    if ((symKeyUtil.commands[cmd_ExportKey].activated ||
         symKeyUtil.commands[cmd_DeleteKey].activated ||
         symKeyUtil.commands[cmd_WrapKey].activated) &&
        !(symKeyUtil.options[opt_Nickname].activated ||
          symKeyUtil.options[opt_KeyID].activated ||
          symKeyUtil.options[opt_KeyIDFile].activated)) {
        PR_fprintf(PR_STDERR,
                   "%s -%c: nickname or id is required for this command (-n, -i, -j).\n",
                   progName, commandToRun);
        return 255;
    }

    /*  -W, -U, and all  -w, -x, or -y to identify the wrapping key  */
    if ((symKeyUtil.commands[cmd_WrapKey].activated ||
         symKeyUtil.commands[cmd_UnwrapKey].activated) &&
        !(symKeyUtil.options[opt_WrapKeyName].activated ||
          symKeyUtil.options[opt_WrapKeyID].activated ||
          symKeyUtil.options[opt_WrapKeyIDFile].activated)) {
        PR_fprintf(PR_STDERR,
                   "%s -%c: wrap key is required for this command (-w, -x, or -y).\n",
                   progName, commandToRun);
        return 255;
    }

    /* -M needs the target slot  (-g) */
    if (symKeyUtil.commands[cmd_MoveKey].activated &&
        !symKeyUtil.options[opt_TargetToken].activated) {
        PR_fprintf(PR_STDERR,
                   "%s -%c: target token is required for this command (-g).\n",
                   progName, commandToRun);
        return 255;
    }

    /*  Using slotname == NULL for listing keys and certs on all slots,
     *  but only that. */

    if (!(symKeyUtil.commands[cmd_ListKeys].activated) && slotname == NULL) {
        PR_fprintf(PR_STDERR,
                   "%s -%c: cannot use \"-h all\" for this command.\n",
                   progName, commandToRun);
        return 255;
    }

    name = SECU_GetOptionArg(&symKeyUtil, opt_Nickname);
    wrapName = SECU_GetOptionArg(&symKeyUtil, opt_WrapKeyName);

    PK11_SetPasswordFunc(SECU_GetModulePassword);

    /*  Initialize NSPR and NSS.  */
    PR_Init(PR_SYSTEM_THREAD, PR_PRIORITY_NORMAL, 1);
    rv = NSS_Initialize(SECU_ConfigDirectory(NULL), certPrefix, certPrefix,
                        "secmod.db", readOnly ? NSS_INIT_READONLY : 0);
    if (rv != SECSuccess) {
        SECU_PrintPRandOSError(progName);
        goto shutdown;
    }
    rv = SECFailure;

    if (PL_strcmp(slotname, "internal") == 0)
        slot = PK11_GetInternalKeySlot();
    else if (slotname != NULL)
        slot = PK11_FindSlotByName(slotname);

    /* generating a new key */
    if (symKeyUtil.commands[cmd_CreateNewKey].activated) {
        PK11SymKey *symKey;

        symKey = PK11_TokenKeyGen(slot, keyType, NULL, keySize,
                                  NULL, PR_TRUE, &pwdata);
        if (!symKey) {
            PR_fprintf(PR_STDERR, "%s: Token Key Gen Failed\n", progName);
            goto shutdown;
        }
        if (symKeyUtil.options[opt_Nickname].activated) {
            rv = PK11_SetSymKeyNickname(symKey, name);
            if (rv != SECSuccess) {
                PK11_DeleteTokenSymKey(symKey);
                PK11_FreeSymKey(symKey);
                PR_fprintf(PR_STDERR, "%s: Couldn't set nickname on key\n",
                           progName);
                goto shutdown;
            }
        }
        rv = SECSuccess;
        PrintKey(symKey);
        PK11_FreeSymKey(symKey);
    }
    if (symKeyUtil.commands[cmd_DeleteKey].activated) {
        PK11SymKey *symKey = FindKey(slot, name, &keyID, &pwdata);

        if (!symKey) {
            char *keyName = keyID.data ? BufToHex(&keyID) : PORT_Strdup(name);
            PR_fprintf(PR_STDERR, "%s: Couldn't find key %s on %s\n",
                       progName, keyName, PK11_GetTokenName(slot));
            PORT_Free(keyName);
            goto shutdown;
        }

        rv = PK11_DeleteTokenSymKey(symKey);
        FreeKeyList(symKey);
        if (rv != SECSuccess) {
            PR_fprintf(PR_STDERR, "%s: Couldn't Delete Key \n", progName);
            goto shutdown;
        }
    }
    if (symKeyUtil.commands[cmd_UnwrapKey].activated) {
        PK11SymKey *wrapKey = FindKey(slot, wrapName, &wrapKeyID, &pwdata);
        PK11SymKey *symKey;
        CK_MECHANISM_TYPE mechanism;

        if (!wrapKey) {
            char *keyName = wrapKeyID.data ? BufToHex(&wrapKeyID)
                                           : PORT_Strdup(wrapName);
            PR_fprintf(PR_STDERR, "%s: Couldn't find key %s on %s\n",
                       progName, keyName, PK11_GetTokenName(slot));
            PORT_Free(keyName);
            goto shutdown;
        }
        mechanism = GetWrapMechanism(wrapKey);
        if (mechanism == CKM_INVALID_MECHANISM) {
            char *keyName = wrapKeyID.data ? BufToHex(&wrapKeyID)
                                           : PORT_Strdup(wrapName);
            PR_fprintf(PR_STDERR, "%s: %s on %s is an invalid wrapping key\n",
                       progName, keyName, PK11_GetTokenName(slot));
            PORT_Free(keyName);
            PK11_FreeSymKey(wrapKey);
            goto shutdown;
        }

        symKey = PK11_UnwrapSymKeyWithFlagsPerm(wrapKey, mechanism, NULL,
                                                &key, keyType, CKA_ENCRYPT, keySize, 0, PR_TRUE);
        PK11_FreeSymKey(wrapKey);
        if (!symKey) {
            PR_fprintf(PR_STDERR, "%s: Unwrap Key Failed\n", progName);
            goto shutdown;
        }

        if (symKeyUtil.options[opt_Nickname].activated) {
            rv = PK11_SetSymKeyNickname(symKey, name);
            if (rv != SECSuccess) {
                PR_fprintf(PR_STDERR, "%s: Couldn't set name on key\n",
                           progName);
                PK11_DeleteTokenSymKey(symKey);
                PK11_FreeSymKey(symKey);
                goto shutdown;
            }
        }
        rv = SECSuccess;
        PrintKey(symKey);
        PK11_FreeSymKey(symKey);
    }

#define MAX_KEY_SIZE 4098
    if (symKeyUtil.commands[cmd_WrapKey].activated) {
        PK11SymKey *symKey = FindKey(slot, name, &keyID, &pwdata);
        PK11SymKey *wrapKey;
        CK_MECHANISM_TYPE mechanism;
        SECItem data;
        unsigned char buf[MAX_KEY_SIZE];
        int ret;

        if (!symKey) {
            char *keyName = keyID.data ? BufToHex(&keyID) : PORT_Strdup(name);
            PR_fprintf(PR_STDERR, "%s: Couldn't find key %s on %s\n",
                       progName, keyName, PK11_GetTokenName(slot));
            PORT_Free(keyName);
            goto shutdown;
        }

        wrapKey = FindKey(slot, wrapName, &wrapKeyID, &pwdata);
        if (!wrapKey) {
            char *keyName = wrapKeyID.data ? BufToHex(&wrapKeyID)
                                           : PORT_Strdup(wrapName);
            PR_fprintf(PR_STDERR, "%s: Couldn't find key %s on %s\n",
                       progName, keyName, PK11_GetTokenName(slot));
            PORT_Free(keyName);
            PK11_FreeSymKey(symKey);
            goto shutdown;
        }

        mechanism = GetWrapMechanism(wrapKey);
        if (mechanism == CKM_INVALID_MECHANISM) {
            char *keyName = wrapKeyID.data ? BufToHex(&wrapKeyID)
                                           : PORT_Strdup(wrapName);
            PR_fprintf(PR_STDERR, "%s: %s on %s is an invalid wrapping key\n",
                       progName, keyName, PK11_GetTokenName(slot));
            PORT_Free(keyName);
            PK11_FreeSymKey(symKey);
            PK11_FreeSymKey(wrapKey);
            goto shutdown;
        }

        data.data = buf;
        data.len = sizeof(buf);
        rv = PK11_WrapSymKey(mechanism, NULL, wrapKey, symKey, &data);
        PK11_FreeSymKey(symKey);
        PK11_FreeSymKey(wrapKey);
        if (rv != SECSuccess) {
            PR_fprintf(PR_STDERR, "%s: Couldn't wrap key\n", progName);
            goto shutdown;
        }

        /* WriteBuf outputs it's own error using SECU_PrintError */
        ret = WriteBuf(symKeyUtil.options[opt_KeyFile].arg, &data);
        if (ret < 0) {
            goto shutdown;
        }
    }

    if (symKeyUtil.commands[cmd_ImportKey].activated) {
        PK11SymKey *symKey = PK11_ImportSymKey(slot, keyType,
                                               PK11_OriginUnwrap, CKA_ENCRYPT, &key, &pwdata);
        if (!symKey) {
            PR_fprintf(PR_STDERR, "%s: Import Key Failed\n", progName);
            goto shutdown;
        }
        if (symKeyUtil.options[opt_Nickname].activated) {
            rv = PK11_SetSymKeyNickname(symKey, name);
            if (rv != SECSuccess) {
                PR_fprintf(PR_STDERR, "%s: Couldn't set name on key\n",
                           progName);
                PK11_DeleteTokenSymKey(symKey);
                PK11_FreeSymKey(symKey);
                goto shutdown;
            }
        }
        rv = SECSuccess;
        PrintKey(symKey);
        PK11_FreeSymKey(symKey);
    }

    /*  List certs (-L)  */
    if (symKeyUtil.commands[cmd_ListKeys].activated) {
        int printLabel = 1;
        if (slot) {
            rv = ListKeys(slot, &printLabel, &pwdata);
        } else {
            /* loop over all the slots */
            PK11SlotList *slotList = PK11_GetAllTokens(CKM_INVALID_MECHANISM,
                                                       PR_FALSE, PR_FALSE, &pwdata);
            if (slotList == NULL) {
                PR_fprintf(PR_STDERR, "%s: No tokens found\n", progName);
            } else {
                PK11SlotListElement *se;
                for (se = PK11_GetFirstSafe(slotList); se;
                     se = PK11_GetNextSafe(slotList, se, PR_FALSE)) {
                    rv = ListKeys(se->slot, &printLabel, &pwdata);
                    if (rv != SECSuccess) {
                        break;
                    }
                }
                if (se) {
                    PORT_CheckSuccess(PK11_FreeSlotListElement(slotList, se));
                }
                PK11_FreeSlotList(slotList);
            }
        }
    }

    /*  Move key (-M)  */
    if (symKeyUtil.commands[cmd_MoveKey].activated) {
        PK11SlotInfo *target;
        char *targetName = symKeyUtil.options[opt_TargetToken].arg;
        PK11SymKey *newKey;
        PK11SymKey *symKey = FindKey(slot, name, &keyID, &pwdata);
        char *keyName;

        if (!symKey) {
            keyName = keyID.data ? BufToHex(&keyID) : PORT_Strdup(name);
            PR_fprintf(PR_STDERR, "%s: Couldn't find key %s on %s\n",
                       progName, keyName, PK11_GetTokenName(slot));
            PORT_Free(keyName);
            goto shutdown;
        }
        target = PK11_FindSlotByName(targetName);
        if (!target) {
            PR_fprintf(PR_STDERR, "%s: Couldn't find slot %s\n",
                       progName, targetName);
            goto shutdown;
        }
        rv = PK11_Authenticate(target, PR_FALSE, &pwdata);
        if (rv != SECSuccess) {
            PR_fprintf(PR_STDERR, "%s: Failed to log into %s\n",
                       progName, targetName);
            goto shutdown;
        }
        rv = SECFailure;
        newKey = PK11_MoveSymKey(target, CKA_ENCRYPT, 0, PR_TRUE, symKey);
        if (!newKey) {
            PR_fprintf(PR_STDERR, "%s: Couldn't move the key \n", progName);
            goto shutdown;
        }
        keyName = PK11_GetSymKeyNickname(symKey);
        if (keyName) {
            rv = PK11_SetSymKeyNickname(newKey, keyName);
            if (rv != SECSuccess) {
                PK11_DeleteTokenSymKey(newKey);
                PK11_FreeSymKey(newKey);
                PR_fprintf(PR_STDERR, "%s: Couldn't set nickname on key\n",
                           progName);
                goto shutdown;
            }
        }
        PK11_FreeSymKey(newKey);
        rv = SECSuccess;
    }

shutdown:
    if (rv != SECSuccess) {
        PR_fprintf(PR_STDERR, "%s: %s\n", progName,
                   SECU_Strerror(PORT_GetError()));
    }

    if (key.data) {
        PORT_Free(key.data);
    }

    if (keyID.data) {
        PORT_Free(keyID.data);
    }

    if (slot) {
        PK11_FreeSlot(slot);
    }

    if (NSS_Shutdown() != SECSuccess) {
        exit(1);
    }

    if (rv == SECSuccess) {
        return 0;
    } else {
        return 255;
    }
}

Messung V0.5
C=95 H=77 G=86

¤ Dauer der Verarbeitung: 0.6 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.