📄 sclogin.c
字号:
DebugOutput("Reconnect!");
if(IsPGPError(PGPsdkReconnect()))
{
DebugOutput("Reconnect failed.");
return CP_NONE;
}
dwRet=CP_NONE;
// Find the correct prefs file
if(!SwitchToCorrectPrefs(pszUserASCII,szNT))
{
DebugOutput("No prefs for user?");
return CP_NONE;
}
err=PGPclPeekClientLibPrefRefs(&prefRef,NULL);
if(IsPGPError(err))
{
DebugOutput("PGPclPeekClientLibPrefRefs failed CP_NONE");
dwRet=CP_NONE;
}
else
{
PGPGetPrefNumber( prefRef,
kPGPPrefCacheType, &cacheType );
PGPGetPrefNumber( prefRef,
kPGPPrefCacheSeconds, &cacheSeconds );
PGPGetPrefBoolean( prefRef,
kPGPPrefShareCache, &globalCache );
err=PGPclOpenDefaultKeyrings(*PGPsc,
kPGPOpenKeyDBFileOptions_None,&(keydb));
if(IsPGPError(err))
{
dwRet=CP_NONE;
}
else
{
DebugOutput("Getting default key!");
err=PGPclGetDefaultPrivateKey(keydb,&key);
DebugOutput("Done getting default!");
if(IsPGPError(err))
{
dwRet=CP_NONE;
}
else
{
char prefs[256];
wsprintf(prefs,
"Type %d Seconds %d global %d",
cacheType,cacheSeconds,globalCache);
DebugOutput(prefs);
// Cache phrase
if(PGPPassphraseIsValid (key,
PGPOPassphrase (*PGPsc, pszPassASCII),
( cacheType == kPGPPrefCacheTypeNone ) ?
PGPONullOption( *PGPsc ) :
PGPOCachePassphrase(*PGPsc,
( cacheType == kPGPPrefCacheTypeLogon ) ?
kPGPMaxTimeInterval : cacheSeconds,
globalCache),
PGPOLastOption (*PGPsc)))
{
DebugOutput("DEBUG VERSION: Caching succeeded");
dwRet=CP_OK;
}
else
{
DebugOutput("DEBUG VERSION: Caching failed");
}
}
PGPFreeKeyDB(keydb);
}
}
return dwRet;
}
#define EWI_NONE 0
#define EWI_DROPWITHWININFO 1
DWORD PGPscEncryptWinInfo(HWND hwnd,
void **vPGPsc,
void **vPGPtls,
void *memmgr,
char *pszUserASCII,
void *pInput,
DWORD dwInputSize,
char *szNT)
{
PGPError err;
void *pOutput;
DWORD dwOutputSize;
PGPKeyDBRef keydb;
PGPKeyDBObjRef key;
PGPPrefRef prefRef;
DWORD dwRet;
PGPContextRef *PGPsc;
PGPtlsContextRef *PGPtls;
PGPsc=(PGPContextRef *)vPGPsc;
PGPtls=(PGPtlsContextRef *)vPGPtls;
DebugOutput("PGPSC: PGPscEncryptWinInfo");
// Wait here till our context is created
WaitOnSC(PGPsc);
if(*PGPsc==(PGPContextRef)(-1))
{
DebugOutput("There is no context. Retreat! EWI_NONE");
return EWI_NONE;
}
dwRet=EWI_NONE;
// Find the correct prefs file
if(!SwitchToCorrectPrefs(pszUserASCII,szNT))
{
DebugOutput("No prefs for user?");
return EWI_NONE;
}
err=PGPclPeekClientLibPrefRefs(&prefRef,NULL);
if(IsPGPError(err))
{
DebugOutput("PGPclPeekClientLibPrefRefs failed EWI_DROPWITHWININFO");
dwRet=EWI_DROPWITHWININFO;
}
else
{
err=PGPclOpenDefaultKeyrings(*PGPsc,
kPGPOpenKeyDBFileOptions_None,&(keydb));
if(IsPGPError(err))
{
dwRet=EWI_DROPWITHWININFO;
}
else
{
DebugOutput("Getting default key!");
err=PGPclGetDefaultPrivateKey(keydb,&key);
DebugOutput("Done getting default!");
if(IsPGPError(err))
{
dwRet=EWI_DROPWITHWININFO;
}
else
{
err = PGPEncode(*PGPsc,
PGPOEncryptToKeyDBObj(*PGPsc,key),
PGPOInputBuffer(*PGPsc,pInput,dwInputSize),
PGPOAllocatedOutputBuffer(*PGPsc,
&(pOutput),100000,&(dwOutputSize)),
PGPOLastOption(*PGPsc));
if(IsPGPError(err))
{
dwRet=EWI_DROPWITHWININFO;
}
else
{
DebugOutput("Setting pref!");
err = PGPSetPrefData (prefRef,
kPGPPrefLoginWindowsInfo,dwOutputSize,pOutput);
if(IsPGPError(err))
{
dwRet=EWI_DROPWITHWININFO;
}
else
{
DebugOutput("Flushing prefs!");
PGPclFlushClientLibPrefs (prefRef, NULL);
dwRet=EWI_DROPWITHWININFO;
}
PGPFreeData(pOutput);
}
memset(pInput,0x00,dwInputSize);
PGPFreeData(pInput);
}
PGPFreeKeyDB(keydb);
}
}
return dwRet;
}
#define DWI_NONE 0
#define DWI_DROPWITHMAIN 1
#define DWI_GETWININFO 2
#define DWI_RETRY 3
#define DWI_DECODEDOK 4
// Make sure to free up ppszPassPhrase and ppszDomain beforehand
DWORD PGPscDecryptWinInfo(HWND hwnd,
void **vPGPsc,
void **vPGPtls,
void *memmgr,
char *pszUserASCII,
char *pszPassASCII,
void **ppOutput,
DWORD *pdwOutputSize,
BOOL bEraseWinInfo,
char *szNT,
DWORD *pdwDecErr)
{
PGPError err;
PGPKeyDBRef keydb;
PGPKeyDBObjRef key;
PGPPrefRef prefRef;
void *szLoginWindowsInfo;
DWORD dwInputSize;
DWORD dwRet;
PGPContextRef *PGPsc;
PGPtlsContextRef *PGPtls;
PGPsc=(PGPContextRef *)vPGPsc;
PGPtls=(PGPtlsContextRef *)vPGPtls;
DebugOutput("PGPSC: PGPscDecryptWinInfo");
WaitOnSC(PGPsc);
if(*PGPsc==(PGPContextRef)(-1))
{
*pdwDecErr=*pdwDecErr|DE_NOCONTEXT;
DebugOutput("There is no context. Retreat! DWI_DROPWITHMAIN");
return DWI_DROPWITHMAIN;
}
dwRet=DWI_NONE;
// Find the correct prefs file
if(!SwitchToCorrectPrefs(pszUserASCII,szNT))
{
*pdwDecErr=*pdwDecErr|DE_NOPREFS;
DebugOutput("No prefs for user?");
// Just go with windows stuff
return DWI_DROPWITHMAIN;
}
err=PGPclPeekClientLibPrefRefs(&prefRef,NULL);
if(IsPGPError(err))
{
*pdwDecErr=*pdwDecErr|DE_NOPREFS;
DebugOutput("PGPclPeekClientLibPrefRefs failed DWI_DROPWITHMAIN");
dwRet=DWI_DROPWITHMAIN;
}
else
{
szLoginWindowsInfo=NULL;
dwInputSize=0;
// If we erase, just don't read it in
if(!bEraseWinInfo)
{
DebugOutput("Reading the windows pref!");
err=PGPGetPrefData(prefRef,
kPGPPrefLoginWindowsInfo,
&dwInputSize,
&szLoginWindowsInfo);
DebugOutput("Done reading the windows pref!");
// Oops. This is bad. Reset it
if(IsPGPError(err))
{
szLoginWindowsInfo=NULL;
dwInputSize=0;
}
}
{
err=PGPclOpenDefaultKeyrings(*PGPsc,
kPGPOpenKeyDBFileOptions_None,&(keydb));
if(IsPGPError(err))
{
*pdwDecErr=*pdwDecErr|DE_NOKEYRINGS;
dwRet=DWI_DROPWITHMAIN;
}
else
{
DebugOutput("Getting default key!");
err=PGPclGetDefaultPrivateKey(keydb,&key);
DebugOutput("Done getting default!");
if(IsPGPError(err))
{
*pdwDecErr=*pdwDecErr|DE_NODEFAULTKEY;
dwRet=DWI_DROPWITHMAIN;
}
else
{
// There is a key to try
// does phrase match selected key ?
if (PGPPassphraseIsValid (key,
PGPOPassphrase (*PGPsc, pszPassASCII),
PGPOLastOption (*PGPsc)))
{
// Yup, lets do blob work
if(szLoginWindowsInfo==NULL)
{
dwRet=DWI_GETWININFO;
}
else
{
*ppOutput=NULL;
*pdwOutputSize=0;
// Decrypt the blob
err = PGPDecode(*PGPsc,
PGPOKeyDBRef(*PGPsc,keydb),
PGPOPassphraseBuffer(*PGPsc,
pszPassASCII,strlen(pszPassASCII)),
PGPOInputBuffer(*PGPsc,szLoginWindowsInfo,dwInputSize),
PGPOAllocatedOutputBuffer(*PGPsc,
ppOutput,100000,pdwOutputSize),
PGPOLastOption(*PGPsc));
if((IsPGPError(err))||(*ppOutput==NULL))
{
dwRet=DWI_GETWININFO;
}
else
{
dwRet=DWI_DECODEDOK;
}
}
}
else
{
DebugOutput("PGP passphrase wrong");
dwRet=DWI_DROPWITHMAIN;
}
}
PGPFreeKeyDB(keydb);
}
if(szLoginWindowsInfo!=NULL)
PGPFreeData(szLoginWindowsInfo);
}
}
return dwRet;
}
/*__Editor_settings____
Local Variables:
tab-width: 4
End:
vi: ts=4 sw=4
vim: si
_____________________*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -