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;