// -----------------------------------------------------------------------------
// CSTSCredentialManager::GenerateCSRL
// Creates a DER encoded PKCS#10 certificate enrollment request.
// -----------------------------------------------------------------------------
//
TDesC8& CSTSCredentialManager::GenerateCSRL(
    const TDesC& aNameInfo,
    const TDesC& aAlgorithm,
    TInt aKeyLen,
    TInt aKeyUsage,
    const TDesC* aSecurityElementID,
    const TDesC* aSecurityElementPrompt)
{
    TInt storeIndex = CheckKeyStoreSEIDL(aSecurityElementID,
                                         aSecurityElementPrompt);

    CKeyInfoBase::EKeyAlgorithm algorithm(CKeyInfoBase::EInvalidAlgorithm);
    if (aAlgorithm.Compare(KSTSAlgorithmRsa()) == 0)
    {
        algorithm = CKeyInfoBase::ERSA;
    }
    else
    {
        CheckOIDL(aAlgorithm);
        User::Leave(KSTSErrSeNoKeys);
    }

    TSTSDistinguishedNameConverter dnConverter;

    CX500DistinguishedName* dName = dnConverter.CreateDNL(aNameInfo);
    delete iDistinguishedName;
    iDistinguishedName = dName;

    HBufC* dispName = dName->DisplayNameL();
    delete iDisplayName;
    iDisplayName = dispName;

    TKeyUsagePKCS15 keyUsage(EPKCS15UsageNone);
    switch (aKeyUsage)
    {
    case KSTSKeyUsageAuthentication:
    {
        keyUsage = EPKCS15UsageSign;
        break;
    }
    case KSTSKeyUsageNonRepudiation:
    {
        keyUsage = EPKCS15UsageNonRepudiation;
        break;
    }
    default:
    {
        User::Leave(KErrKeyUsage);
    }
    }

    // have to search for the key
    TCTKeyAttributeFilter filter;
    filter.iKeyAlgorithm = algorithm;
    filter.iUsage = keyUsage;
    RMPointerArray< CCTKeyInfo >* keyInfoArray =
        new(ELeave) RMPointerArray< CCTKeyInfo >();
    if (iKeyInfoArray)
    {
        iKeyInfoArray->Close();
        delete iKeyInfoArray;
    }
    iKeyInfoArray = keyInfoArray;

    iKeyLen = aKeyLen;

    iState = ESearchingKey;
    iKeyStore->KeyStore(storeIndex).List(
        *iKeyInfoArray, filter, iStatus);

    WaitForCompletionL();

    return *iRequestEncoded;
}
Пример #2
0
int main(int argc,char *argv[])
{
    struct pgpmainBones *mainbPtr = &_pgp_mainBones;
    struct pgpargsBones *argsbPtr;
    struct pgpfileBones *filebPtr;
    struct pgpenvBones *envbPtr;
    PGPContextRef mainContext;
    int errorLvl = 0, status;
    PGPError err = PGPsdkInit();
    pgpAssertNoErr(err);

    err = PGPsdkNetworkLibInit();
    pgpAssertNoErr(err);

    err = PGPNewContext( kPGPsdkAPIVersion, &mainContext );
    pgpAssertNoErr(err);

    err = pgpInitSDKPrefsDir( mainContext );
    pgpAssertNoErr(err);

    initMainBones( mainbPtr, mainContext );

    signonMsg(mainbPtr);

    /* link the context and initialize what used to be the global
       variables. */
    argsbPtr = mainbPtr->argsbPtr;
    filebPtr = mainbPtr->filebPtr;
    envbPtr = mainbPtr->envbPtr;
    err = pgpParseArgs( mainbPtr, argc, argv, &errorLvl);
    /* parse the arguments */
    if(err != 0)
        goto ex;

    if (argsbPtr->keyFlag && argsbPtr->keyChar == '\0') {
        keyUsage(filebPtr,&errorLvl);
        goto ex;
    }

    if (argsbPtr->groupFlag && argsbPtr->groupChar == '\0') {
        groupUsage(filebPtr,&errorLvl);
        goto ex;
    }

    /*
     * Write to stdout if explicitly asked to, or in filter mode and
     * no explicit file name was given.
     */
    mainbPtr->outputStdout = argsbPtr->outputFileName ?
        strcmp(argsbPtr->outputFileName, "-") == 0 : envbPtr->filterMode;

#if 1
    /* At request of Peter Simons, use stderr always. Sounds reasonable. */
    /* JIS: Put this code back in... removing it broke too many things */
    if (!mainbPtr->outputStdout)
        filebPtr->pgpout = stdout;
#endif

#if defined(PGP_UNIX) || defined(VMS)
    umask(077); /* Make files default to private */
#endif

    initSignals(); /* Catch signals */

    /* get our groups...*/
    err = pgpInitializeWorkingGroupSet( mainbPtr );

    if (argsbPtr->keyFlag) {
        status = doKeyOpt( mainbPtr, argsbPtr->keyChar, &errorLvl );
        if (status < 0) {
            userError(filebPtr,&errorLvl);
            goto ex;
        }
        errorLvl=status;
        goto ex;
    }

    if(argsbPtr->groupFlag) {
        status = doGroupOpt( mainbPtr, argsbPtr->groupChar, &errorLvl );
        if( status < 0 ) {
            userError(filebPtr,&errorLvl);
            goto ex;
        }
        errorLvl=status;
        goto ex;
    }

    err = pgpProcessArgs(mainbPtr, &errorLvl);

ex:
    err = pgpFinalizeWorkingGroupSet( mainbPtr );

    pgpTearDown( mainbPtr, &errorLvl );

    exit(errorLvl);
    /*NOTREACHED*/
    return errorLvl;
}