Nach etwas Zögern hab ich den C++-Code mit Visual Studio selbst kompiliert und anschließende Tests bestätigen die Vermutung, dass damit mehr als zwei Signaturen auslesbar sind.
Nun wollte ich den Code nach Delphi übersetzen, aber ich komme auf keinen grünen Zweig. Aktuell ist meine Übersetzung instabil, d.h. mal wird aus derselben Datei eine Signatur gelesen, dann doch wieder zwei (und mehr als zwei hab ich noch nicht erreichen können).
Nachfolgend einige konkrete Code-Beispiele, in der Hoffnung, dass darin mein (Denk)Fehler zu finden ist.
Code:
CONST UCHAR SG_ProtoCoded[] = {
0x30, 0x82,
};
CONST UCHAR SG_SignedData[] = {
0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x02,
};
habe ich übersetzt mit
Delphi-Quellcode:
const
SG_ProtoCoded: array[0..1] of Byte = ($30, $82);
SG_SignedData: array[0..8] of Byte = ($2a, $86, $48, $86, $f7, $0d, $01, $07, $02);
Ist das korrekt? Was bedeuten die abschließenden Kommas im C++?
Die Makros und deren Benutzung hab ich so übersetzt:
Code:
#define XCH_WORD_LITEND(num) \
(WORD)(((((WORD)num) & 0xFF00) >> 8) | ((((WORD)num) & 0x00FF) << 8))
#define _8BYTE_ALIGN(offset, base) \
(((offset + base + 7) & 0xFFFFFFF8L) - (base & 0xFFFFFFF8L))
cbCurrData = XCH_WORD_LITEND(*(WORD *)(pbCurrData + 2)) + 4;
pbNextData += _8BYTE_ALIGN(cbCurrData, (ULONG_PTR)pbCurrData);
Delphi-Quellcode:
var
LpbCurrData, LpbNextData: PByte;
LcbCurrData: DWORD;
function BigEndianToLittleEndian(const A: Word): Word;
begin
Result:= Word(((A AND $FF00) shr 8) OR ((A AND $00FF) shl 8));
end;
function _8ByteAlign(const offset, base: NativeUInt): NativeUInt;
begin
Result:= ((offset + base + 7) AND $FFFFFFF8) - (base AND $FFFFFFF8);
end;
//LcbCurrData:= Swap(Word(LpbCurrData)+2) + 4;
LcbCurrData:= BigEndianToLittleEndian(Word(LpbCurrData)+2) + 4;
Inc(LpbNextData, _8ByteAlign(LcbCurrData, ULONG_PTR(LpbCurrData)));
Was bedeutet der erste Stern in diesem Aufruf
Code:
cbCurrData = XCH_WORD_LITEND(*(WORD *)(pbCurrData + 2)) + 4;
Was genau wird da übergeben? Ein Pointer auf einen Pointer auf ein Word?
Oder liegt das Problem in der Abbruchbedingung?
Code:
if (memcmp(pbCurrData + 0, SG_ProtoCoded, sizeof(SG_ProtoCoded)) ||
memcmp(pbCurrData + 6, SG_SignedData, sizeof(SG_SignedData)))
{
break;
}
Delphi-Quellcode:
if ((NOT CompareMem(PByte(NativeUInt(LpbCurrData) + 0), @SG_ProtoCoded, SizeOf(SG_ProtoCoded))) OR
((NOT CompareMem(PByte(NativeUInt(LpbCurrData) + 6), @SG_SignedData, SizeOf(SG_SignedData))))) then
Break;
Grüße
Dalai