Einzelnen Beitrag anzeigen

Benutzerbild von Back2Code
Back2Code

Registriert seit: 6. Feb 2012
Ort: Deutschland
272 Beiträge
 
Delphi XE7 Professional
 
#1

Problem mit PAnsiChar und Rückgabewert einer Funktion CryptoSys PKI

  Alt 7. Sep 2015, 11:28
Guten Morgen DP'ler,

ich arbeite derzeit mit dem Interface von dem CryptoSys PKI (http://www.cryptosys.net/delphi.html)

Hier mal ein Auszug aus dem Interface

Delphi-Quellcode:
.
.
function CMS_ReadSigDataToString(szDataOut : PAnsiChar; nDataOutLen : Integer; szFileIn : AnsiString; nOptions : Integer) : Integer; stdcall; external 'diCrPKI.dll';
.
.
szDataOut ist der Parameter den ich als Rückgabewert erwarte / mit dem ich arbeiten muss da dieser den entschlüsselten String enthält.

Die Deklaration als normaler String fiel schonmal weg, dann hab ich es als strData: Array [0..40] of Ansichar; deklariert und bekomme auch die richtigen Rückgabewerte das Problem hierbei ist allerdings, dass damit die Länge des Rückgabewertes bereits vordefiniert ist und ich logischerweise ne dicke Exception bekomme, sobald der Output größer als 40 Chars ist.

Was kann ich machen um die Länge des Arrays passend zu dem Output zu definieren, dass nichts fehlt/abgeschnitten ist? Beim Versuch ein dynamisches Array zu nutzen bekam ich:

Code:
[dcc32 Fehler] uMain.pas(435): E2010 Inkompatible Typen: 'PAnsiChar' und 'Dynamic array'
Aufruf:
nRet := CMS_ReadSigDataToString(strData, nDataLen, strSigFile, 0); Codeauszug:

Delphi-Quellcode:
var
  strData: Array [0..40] of Ansichar;
  nDataLen: Integer;
begin
    // Read in the recipient's private key
    strPrivateKey := rsaReadPrivateKey(strPriKeyFile, strPassword);
    if Length(strPrivateKey) = 0
      then begin
        WriteDebugMessage('Schlüssel konnte nicht eingelesen werden.');
      end
      else begin
        WriteDebugMessage('Schlüssel erfolgreich gelesen' + #13#10 + 'Schlüssellänge in Bits: ' + IntToStr(RSA_KeyBits(strPrivateKey)));
      end;

    // Intermediate file we will create
    strSigFile := strInputFile + '.i2.tmp';

    // Read the encrypted data from the enveloped-data file
    nRet := CMS_ReadEnvData(strSigFile, strInputFile, '', strPrivateKey, 0); //
    WriteDebugMessage('CMS_ReadEnvData returns ' + IntToStr(nRet) + ' (expected 0)');
    if nRet <> 0
      then begin
        WriteDebugMessage('**ERROR** while reading the encrypted data from the enveloped-data file');
      end
      else
      begin
        WriteDebugMessage('Extracted signed-data file ' + strSigFile);
      end;

    //How long is the content to be read?
    nDataLen := CMS_ReadSigDataToString('', 0, strSigFile, 0);
    if nDataLen <= 0
    then begin
      WriteDebugMessage('Cannot read signed-data file');
    end
   else
   begin
     nRet := CMS_ReadSigDataToString(strData, nDataLen, strSigFile, 0);
      WriteDebugMessage('CMS_ReadSigDataToString returns ' + IntToStr(nRet));
      WriteDebugMessage('Data is [' + strData + ']');
      Result := strData;
   end;
00111100001100110010000001000100011001010110110001 1100000110100001101001
  Mit Zitat antworten Zitat