При использовании EncryptMessage (SChannel) из API win32 с допустимым контекстом я поставляю четыре буфера в правильном порядке. Я получаю ответ 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) ***
Как выглядит операционная система, получающая правильную информацию.
Я немного искал и обнаружил, что 80090308 обычно означает что-то неправильное с сертификатом, так как полное имя сервера должно быть в теме CN = www.foobar.com, но это не устраняет проблему либо , сертификат и CA создаются с помощью OpenSSL.
Рад видеть, что вы Macking прогресс –
Можете ли вы подтвердить, что 'значение FSecPkgSizes.cbHeader' 5,' значение InDataLength' между 1 и 16362 и 'значение FSecPkgSizes.cbTrailer' 16? –
Да, достигнув прогресса :). Еще раз спасибо за вашу помощь. В этом случае cbHeader равен 5, InDataLength равно 23 (он говорит, что будет жаловаться, если он слишком мал), но cbTrailer 36 не 16, я жестко закодировал его до 16, но до сих пор не радует. – Bruce