當使用具有有效上下文的win32 API中的EncryptMessage(SChannel)時,我按照正確的順序提供了四個緩衝區我得到SEC_E_INVALID_TOKEN響應,根據文檔找到的是SECBUFFER_DATA類型的緩衝區。我知道pvBuffers的集合應該從連續的內存中分配出來以提高速度,但爲了簡單起見,我已經明確了它是什麼。任何人都可以看到問題可能是什麼?EncryptMessage返回SEC_E_INVALID_TOKEN
謝謝, 布魯斯
的代碼是下面;
procedure TTCPSocket.SSPEncryptBuffer(SSPCtx: PCtxtHandle; InData: PAnsiChar; InDataLength: Cardinal);
var
SecStatus: TSecurityStatus;
SecBufDesc: TSecBufferDesc;
SecBufs: packed array [0 .. 3] of TSecBuffer;
begin
SecBufs[0].BufferType := SECBUFFER_STREAM_HEADER;
SecBufs[0].cbBuffer := FSecPkgSizes.cbHeader;
SecBufs[0].pvBuffer := AllocMem(FSecPkgSizes.cbHeader);
SecBufs[1].BufferType := SECBUFFER_DATA;
SecBufs[1].cbBuffer := InDataLength;
SecBufs[1].pvBuffer := InData;
SecBufs[2].BufferType := SECBUFFER_STREAM_TRAILER;
SecBufs[2].cbBuffer := FSecPkgSizes.cbTrailer;
SecBufs[2].pvBuffer := AllocMem(FSecPkgSizes.cbTrailer);
SecBufs[3].BufferType := SECBUFFER_EMPTY;
SecBufs[3].cbBuffer := 0;
SecBufs[3].pvBuffer := nil;
SecBufDesc.ulVersion := SECBUFFER_VERSION;
SecBufDesc.cBuffers := 4;
SecBufDesc.pBuffers := @SecBufs[0];
SecStatus := EncryptMessage(SSPCtx, 0, @SecBufDesc, 0);
if SecStatus <> SEC_E_OK then
begin
// Error code..
end;
end;
我用STRACE注入到可執行文件中,這行看起來很有趣;
12/07/2009 23:10:30:635 - SecBuffer #0 BufferType:0x00000007 cbBuffer:5
12/07/2009 23:10:30:636 - SecBuffer #1 BufferType:0x00000001 cbBuffer:13
12/07/2009 23:10:30:636 - SECBUFFER_DATA - 13 byte(s)/EncryptMessage - INPUT
=====================================================
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0fabcdef
0000: 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 00 hello world!.
=====================================================
12/07/2009 23:10:30:636 - SecBuffer #2 BufferType:0x00000006 cbBuffer:36
12/07/2009 23:10:30:636 - SecBuffer #3 BufferType:0x00000000 cbBuffer:0
12/07/2009 23:10:30:636 -
*** WARNING : EncryptMessage failed (80090308) ***
看起來好像OS正在獲取正確的信息。
我已經搜索了一下,發現80090308通常意味着證書有問題,因爲服務器的全名應該在主題CN = www.foobar.com中,但是這並沒有解決問題,證書和CA由OpenSSL生成。
很高興見到你macking進步 – 2009-11-25 00:46:40
你能否證實'FSecPkgSizes.cbHeader'值是5,'InDataLength'值介於1和16362和'FSecPkgSizes.cbTrailer'值是16? – 2009-11-25 01:04:00
是的,正在取得進展:)。再次感謝您的幫助。在這種情況下,cbHeader是5,InDataLength是23(它說它會抱怨,如果它太小),但cbTrailer是36而不是16,我硬編碼到16,但仍然沒有喜悅。 – Bruce 2009-11-25 01:17:11