Ir para conteúdo
  • Cadastre-se

carloscaloca

Membros
  • Total de ítens

    11
  • Registro em

  • Última visita

Posts postados por carloscaloca

  1. Bom dia, descobri que quando o lazarus inicia o array mHashBuffer deveria ser preenchido #0, fiz uma pequena alteração e, pra mim, funcionou bem.

     

    function TDFeWinCrypt.CalcHash(const AStream: TStream; const Digest: TSSLDgst;
      const Assina: Boolean): AnsiString;
    var
      mCryptProvider, mCryptProviderCert: HCRYPTPROV;
      mHash, aHashType: HCRYPTHASH;
      hRSAKey, hSessKey, hExpKey: HCRYPTKEY;
      I: Integer;
      mTotal: Int64;
      mBytesLen, mRead, dwKeySpec, WinErro: DWORD;
      Memory: Pointer;
      mHashBuffer: array [0..1023] of AnsiChar;  // 1024 - Tamanho máximo do maior Hash atual
      pfCallerFreeProv: LongBool;
    begin
      Result := '';
      FillChar(mHashBuffer,1024,0);  // alteração
      case Digest of
        dgstMD2    : aHashType := CALG_MD2;

     

    Talvez seja necessário colocar algum diretriz para funcionar melhor.

    • Curtir 2
  2. Depurei ao mesmo tempo com o delphi e o lazarus, a variavel é passada com 1024bytes, quando volta, no delphi ela tem Length(mHashBuffer) = 256bytes, testei varias vezes e no lazarus 1024. No delphi apartir da posição 256 vem cheio de   #0 e no lazarus ficam outros bytes. A função que busca a chave é a mesma, mas talves quando o Lazarus aponte pra o endereço da variavel coloque sujeira, como é feita a reversão, o lazarus não pega o valor correto da chave, eu acho. 

  3. fiz a alteração mas gerou um erro, não achou o numero do certificado. Fiz outra depuração e achei um erro no seguinte código:

    ACBrDFeWinCrypt

        1229     mBytesLen := Length(mHashBuffer);  // aqui, no delphi  o mHashBuffer tem tamanho de 256 e no Lazarus 1024

            if Assina then
            begin
              if CryptSignHash(mHash, dwKeySpec, Nil, 0, @mHashBuffer, mBytesLen ) then
              begin
                // MS CryptoAPI retorna assinatura em "Little Endian bit string", invertendo...
                Result := '';
                while (mBytesLen > 256) and (mHashBuffer[mBytesLen-1] = #0) do
                  Dec(mBytesLen);

                for I := mBytesLen downto 1 do
                  Result := Result + mHashBuffer[I-1];
              end  

     

  4. Sim, consegue consultar status. Parece algum problema na chave:

    o primeiro em delphi e o outro em lazarus.

     

    43200814620101000170650010000000151740249251-nfe.xml 43200814620101000170650010000000151040520823-nfe.xml

    Eu achei o seguinte código em ACBrDFeWinCrypt linha 861:


      {$IfDef DELPHI2009_UP}
       StoreProvider := CERT_STORE_PROV_SYSTEM_W;
      {$ELSE}
       StoreProvider := CERT_STORE_PROV_SYSTEM_A;
      {$ENDIF};

      FpStore := CertOpenStore(
          StoreProvider, 0, 0,
          StoreFlag or CERT_STORE_READONLY_FLAG,
          LPCTSTR( FpDFeSSL.StoreName ) );      

×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...