⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyremove.c

📁 vc环境下的pgp源码
💻 C
📖 第 1 页 / 共 3 页
字号:
        char* ringfile )
{
    PGPContextRef context = mainbPtr->pgpContext;
    struct pgpfileBones *filebPtr = mainbPtr->filebPtr;
    PGPError err;
    PGPFileSpecRef ringFileSpec = NULL;
    PGPKeySetRef ringSet = NULL;
    PGPKeySetRef keyset = NULL;
    PGPKeyListRef keylist = NULL;
    PGPKeyIterRef keyiter = NULL;
    PGPKeyRef key;
    PGPKeyRef sigkey;
    PGPUInt32 nkeys = 0;
    PGPUInt32 nsigs = 0;
    int keeping = 0;
    int nremoved = 0;

    fprintf( filebPtr->pgpout,
LANG("\nRevoking your signatures from userid '%s' in key ring '%s'\n"),
             (mcguffin), ringfile );

    /* find mcguffin in specified ring */
    err = PGPNewFileSpecFromFullPath( context, ringfile, &ringFileSpec );
    pgpAssertNoErr(err);

    /* we need this for getting our secret key */
    err = pgpOpenKeyringsFromPubringSpec( mainbPtr, ringFileSpec,
				&ringSet, kPGPKeyRingOpenFlags_Mutable );
    PGPFreeFileSpec(ringFileSpec);
    if( IsPGPError(err) ) {
        fprintf(filebPtr->pgpout,
                LANG("\n\007Can't open keyring '%s'.\n"),ringfile );
        return -1;
    }

    mainbPtr->workingRingSet=ringSet;
    /*mainbPtr->workingGroupSet=NULL;*/
    err = pgpGetMatchingKeySet(mainbPtr, mcguffin, 0, &keyset );
    pgpAssertNoErr(err);

    err = PGPCountKeys( keyset, &nkeys );
    pgpAssertNoErr(err);

    if( nkeys == 0 ) {
        fprintf(filebPtr->pgpout,
                LANG("\n\007Key not found in key ring '%s'.\n"),
                ringfile );
        goto done;
    }

    keeping = 1;

    err = PGPCheckKeyRingSigs( keyset, ringSet, 0, NULL, NULL );

    err = PGPOrderKeySet( keyset, kPGPAnyOrdering, &keylist );
    pgpAssertNoErr(err);
    err = PGPNewKeyIter( keylist, &keyiter );
    pgpAssertNoErr(err);
    err = PGPKeyIterRewind( keyiter );
    pgpAssertNoErr(err);
    err = PGPKeyIterNext( keyiter, &key);
    pgpAssertNoErr(err);

    /* for all keys */
    while( key != NULL ) {
        PGPUserIDRef userid;
        PGPSize actual;
        PGPSigRef sig;
        char useridstr[ kPGPMaxUserIDSize ];

        err = PGPKeyIterRewindUserID( keyiter );
        pgpAssertNoErr(err);
        err = PGPKeyIterNextUserID( keyiter, &userid );
        pgpAssertNoErr(err);

        /* for all userids of key */
        while( userid ) {
            err = PGPGetUserIDStringBuffer( userid, kPGPUserIDPropName,
                    kPGPMaxUserIDSize, useridstr, &actual );

            pgpAssertNoErr(err);

            err = PGPKeyIterRewindUIDSig( keyiter );
            pgpAssertNoErr(err);
            err = PGPKeyIterNextUIDSig( keyiter, &sig );
            pgpAssertNoErr(err);
            /* for all sigs of all userids of all keys */
            while( sig != NULL ) {
                PGPBoolean propData;
                err = PGPGetSigBoolean( sig, kPGPSigPropIsMySig, &propData );
                if( propData ) {
                    nsigs++;
                    pgpShowKeyBrief( filebPtr, key );
                    fprintf( filebPtr->pgpout, LANG("\nuser ID: %s\n"),
                            useridstr );
                    pgpShowKeySig( filebPtr, ringSet, sig, kShow_Checks );
                    fprintf(filebPtr->pgpout, LANG(
                        "Revoke your signature of this user id (y/N)? "));
                    if (!(keeping = !getyesno(filebPtr,'n',0))) {
                        char* passphrase;
                        PGPBoolean mine = 0;
                        nremoved++;
                        err = PGPGetSigCertifierKey( sig, ringSet, &sigkey);
                        pgpAssertNoErr(err);
                        err = pgpGetValidPassphrase( mainbPtr, sigkey,
                                &passphrase, &mine );
                        pgpAssertNoErr(err);
                        err = PGPRevokeSig( sig, ringSet,
                                PGPOPassphrase( context, passphrase ),
                                PGPOLastOption(context) );

                        pgpAssertNoErr(err);
                        if(mine) {
                            PGPFreeData(passphrase);
                            pgpRemoveFromPointerList( mainbPtr->leaks,
                                    passphrase );

                        }
                        break;
                    }
                }
                err = PGPKeyIterNextUIDSig( keyiter, &sig );
            }
            err = PGPKeyIterNextUserID(keyiter,&userid);
        }
        err = PGPKeyIterNext( keyiter, &key );
    }

    if( nremoved == 0 )
        fprintf(filebPtr->pgpout,LANG("\nNo user id's revoked.\n"));
    else {
        fprintf(filebPtr->pgpout,LANG("\n%d user id(s) revoked.\n"),
                nremoved);
    }

    /*PGPPropagateTrust( ringSet ); <- not here.*/
    if( PGPKeySetNeedsCommit( ringSet ) ) {
        err = PGPCommitKeyRingChanges( ringSet );
        pgpAssertNoErr(err);
    }

done:
    if(keyiter)
        PGPFreeKeyIter(keyiter);
    if(keylist)
        PGPFreeKeyList(keylist);
    if(keyset)
        PGPFreeKeySet(keyset);
    if( ringSet ) {
        PGPFreeKeySet( ringSet );
        mainbPtr->workingRingSet = NULL;
    }
    return kPGPError_NoErr;
}

PGPError removeSigs(struct pgpmainBones* mainbPtr, char* mcguffin, char*
        ringfile, char *origRingFileName )
{
    PGPContextRef context = mainbPtr->pgpContext;
    struct pgpfileBones *filebPtr = mainbPtr->filebPtr;
    PGPBoolean compatible = mainbPtr->envbPtr->compatible;
    PGPEnv *env = mainbPtr->envbPtr->m_env;
    PGPUInt32 pri;
    PGPError err, er2;
    PGPFileSpecRef ringFileSpec = NULL;
    PGPKeySetRef ringSet = NULL;
    PGPKeySetRef keyset = NULL;
    PGPKeyListRef keylist = NULL;
    PGPKeyIterRef keyiter = NULL;
    PGPKeyRef key;
    PGPUInt32 nkeys = 0;
    PGPUInt32 nsigs = 0;
    int keeping = 0;
    int nremoved = 0;

    fprintf( filebPtr->pgpout,
        LANG("\nRemoving signatures from userid '%s' in key ring '%s'\n"),
        (mcguffin), ringfile );

    /* find mcguffin in specified ring */
    err = PGPNewFileSpecFromFullPath( context, ringfile, &ringFileSpec );
    pgpAssertNoErr(err);
    err = pgpOpenKeyringsFromPubringSpec( mainbPtr, 
				ringFileSpec, &ringSet, kPGPKeyRingOpenFlags_Mutable);
    if( IsPGPError(err) ) {
        fprintf(filebPtr->pgpout,
                LANG("\nCan't open key ring file '%s'\n"),
                ringfile);
        goto done;
    }

    mainbPtr->workingRingSet=ringSet;
    /*mainbPtr->workingGroupSet=NULL;*/
    err = pgpGetMatchingKeySet(mainbPtr, mcguffin, 0, &keyset );
    pgpAssertNoErr(err);

    err = PGPCountKeys( keyset, &nkeys );
    pgpAssertNoErr(err);

    if( nkeys == 0 ) {
        fprintf(filebPtr->pgpout,
                LANG("\n\007Key not found in key ring '%s'.\n"),
                origRingFileName );
        goto done;
    }

    keeping = 1;

    err = PGPOrderKeySet( keyset, kPGPAnyOrdering, &keylist );
    pgpAssertNoErr(err);
    err = PGPNewKeyIter( keylist, &keyiter );
    pgpAssertNoErr(err);
    err = PGPKeyIterRewind( keyiter );
    pgpAssertNoErr(err);
    err = PGPKeyIterNext( keyiter, &key);
    pgpAssertNoErr(err);

    /* for all keys */
    while( key != NULL ) {
        PGPUserIDRef userid;
        PGPSize actual;
        PGPSigRef sig;
        char useridstr[ kPGPMaxUserIDSize ];

        err = PGPKeyIterRewindUserID( keyiter );
        pgpAssertNoErr(err);
        err = PGPKeyIterNextUserID( keyiter, &userid );
        pgpAssertNoErr(err);

        pgpShowKeyBrief( filebPtr, key );

        err =  countSigsOnKey( keyiter, &nsigs );
        pgpAssertNoErr(err);

        if( nsigs == 0 ) {
            fprintf(filebPtr->pgpout,
                    LANG("\nKey has no signatures to remove.\n"));
        }
        else {
            fprintf(filebPtr->pgpout,
                    LANG("\nKey has %d signatures(s):\n"),nsigs);
        }

        nsigs=0;

	err = PGPKeyIterRewindUserID(keyiter);
	pgpAssertNoErr(err);
	err = PGPKeyIterNextUserID(keyiter, &userid);
	pgpAssertNoErr(err);

        /* for all userids of key */
        while( userid ) {
            err = PGPGetUserIDStringBuffer( userid, kPGPUserIDPropName,
                    kPGPMaxUserIDSize, useridstr, &actual );
	    fprintf(filebPtr->pgpout,
		LANG("\nSingatures for userid %s:\n"), useridstr);

            pgpAssertNoErr(err);

            err = PGPKeyIterRewindUIDSig( keyiter );
            pgpAssertNoErr(err);
            err = PGPKeyIterNextUIDSig( keyiter, &sig );
            /*if err, there are none.*/
            /* for all sigs of all userids of all keys */
            while( sig != NULL ) {
                nsigs++;
                pgpShowKeySig( filebPtr, ringSet, sig, 0 );
                fprintf(filebPtr->pgpout,
                        LANG("Remove this signature (y/N)? "));

                if (!(keeping = !getyesno(filebPtr,'n',0))) {
                    nremoved++;
                    PGPRemoveSig( sig );
                }
                err = PGPKeyIterNextUIDSig( keyiter, &sig );
                /*if err, there are no more.*/
            }
            err = PGPKeyIterNextUserID(keyiter,&userid);
            /*if err, there are no more.*/
        }
        err = PGPKeyIterNext( keyiter, &key );
    }
    if( err == kPGPError_EndOfIteration )
        err = kPGPError_NoErr;

    if( nremoved == 0 )
        fprintf(filebPtr->pgpout,LANG("\nNo key signatures removed.\n"));
    else
        fprintf(filebPtr->pgpout,
        LANG("\n%d key signatures(s) removed.\n"), nremoved);

    if( PGPKeySetNeedsCommit( ringSet ) ) {
        err = PGPCommitKeyRingChanges( ringSet );
        pgpAssertNoErr(err);
    }

done:
    if( keyiter)
        PGPFreeKeyIter( keyiter );
    if( keylist )
        PGPFreeKeyList( keylist );
    if( keyset )
        PGPFreeKeySet( keyset );
    if( ringSet )
        PGPFreeKeySet( ringSet );
    mainbPtr->workingRingSet = NULL;
    if( ringFileSpec )
        PGPFreeFileSpec( ringFileSpec);

    if (!compatible && IsPGPError(err) &&
        pgpenvGetInt( env, PGPENV_VERBOSE, &pri, &er2))
        pgpShowError( filebPtr, err, __FILE__,__LINE__);

    return err;
}















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -