Python a dll pisane pre C+ nechcu papat bytearray

Python a dll pisane pre C+ nechcu papat bytearray
« kdy: 07. 03. 2021, 08:53:52 »
Zdravim.
Potreboval by som trosku poradit.
Popis zadania. Zober si kniznicu DLL na sifrovanie. Inicializuj, podpis kluc a potom dostanes vysledok. Easy. Nacitam DLL Pripojim sa inicializujem , registrujem.
Problem je ked chcem podpisovat kluc.
Toto je example ako to chlapik pouziva v C
Kód: [Vybrat]
typedef struct tTagData
{
   u64_t ddwUID;
   u8_t data[DFSD_DATA_BLOCK_SIZE];
   u8_t signedData[DFSD_DATA_BLOCK_SIG_SIZE];
} tagData_t;
 
 
tagData_t myTagData;
 
    u8_t abDummyBlockData1[DFSD_DATA_BLOCK_SIZE]={
             0x00, 0x00, 0x00, 0x00,  //reg7
             0x50, 0xa0, 0x00, 0x00,  //reg8
             0x61, 0x03, 0x00, 0x7d,  //reg9
             0xf3, 0xbd, 0x8f, 0xe5,  //reg10
             0x25, 0x81, 0x9c, 0x20,  //reg11
             0x00, 0x00, 0x00, 0x00,  //reg12
             0x41, 0x41, 0x30, 0x30,  //reg13
             0x31, 0x32, 0x36, 0x31,  //reg14
             0x00, 0x00, 0x00, 0x00   //reg15
       };
 
 
myTagData.ddwUID = (u64_t)0xD0021F673FC988F0;
memcpy(myTagData.data,abDummyBlockData1,DFSD_DATA_BLOCK_SIZE);
 
iRetval = SignData(myTagData);
Cisto teoreticky aj ked bude vsetko 0 by mi kluc mal nieco vratit. Minimalne chybovu hlasku. Nech tam poslem co  len chcem vzdy mi to vzhaduje internu chybu kluca. Clovek ktory pisal tu dll mi tvrdil ze je zla dlzka vstupnych dat (bytearray) to som riesil tak ze mam natvrdo retazec plny 0 o dlzke ako si predstavuje a ten posielam do tej funkcie. Samozerejme ze to nefunguje. On ma presviedca ze je chyba na 100% v pythone "lebo mne to funguje".

Co ja mam v mojom programe je jednoducho string a potom .encode a dostanem bytearray. Vedel by mi niekto poradit co moze byt zle pripadne napisat kusok kodu ako by to riesil on? Uz sa s tym trapim tyzden a vyskusal som co ma napadlo ale ani za pana to nechce fungovat.

Fakt budem rad za kazdu radu.


Re:Python a dll pisane pre C+ nechcu papat bytearray
« Odpověď #1 kdy: 07. 03. 2021, 12:15:07 »
proc sem nedas i ten python kod, pripadne i to dll? takhle ti muzu jen doporucit skvely jenduv blog:
https://www.abclinuxu.cz/blog/jenda/2021/2/python-c-a-cffi

Re:Python a dll pisane pre C+ nechcu papat bytearray
« Odpověď #2 kdy: 07. 03. 2021, 12:19:43 »
zkus si ty tvoje otazky vzdycky precist "cizima ocima".
ja bych tam cekal s cim presne je problem, cos zkusil a nefungovalo(vsechno pochopitelne v kodu), pripadne jakou dokumentaci jsi k tomu precetl a nenasel odpoved

takhle bych si stahl tvoje podklady amohl sena to mrknout, kdyz takove podklady nedas, tak se nediv ze se za ty otazky pak stydis..


protip: korektni formulace otazky me casto privedla k reseni, je to podobej postup jako rubber duck review, vysvetlujes svuj problem nekomu kdo o nem nic nevi a tim si to rovnas hlave.

Re:Python a dll pisane pre C+ nechcu papat bytearray
« Odpověď #3 kdy: 07. 03. 2021, 13:06:00 »
No to je prave ten problem ze cele je to "pod licenciou" ktora mi zakazuje cokolvek publikovat.
Ale mate pravdu.
Skusim to takto
v pythone nespravim nic ine len.
Kód: [Vybrat]
#nazov funkcie
SignData = getattr(USB_dongle, "?SignData@@YAHAAUtTagData@@@Z")
SignData.argtypes  = [c_char_p]
SignData.restype = c_char_p
#Data pre funkciu
ID = 'E0ABDGD12X0'
Data_input = '00000000000000000000000000'
Data_output = '0000000000000000000000000000000000000000000000000000'

key_set = ID+Data_input+Data_output
key_set = key_set.encode

print(SignData(key_set))

tecka

Re:Python a dll pisane pre C+ nechcu papat bytearray
« Odpověď #4 kdy: 07. 03. 2021, 16:53:26 »
Kód: [Vybrat]
?SignData@@YAHAAUtTagData@@@Z
je int __cdecl SignData(struct tTagData &)
Takže signaturu funkce máš blbě.

Kód: [Vybrat]
ID = 'E0ABDGD12X0'  # u64_t ma 8 bajtů, proč je tady 11 znaků?
Data_input = '00000000000000000000000000'  # DFSD_DATA_BLOCK_SIZE je aspoň 36 bajtů, proč je tady 26 znaků?
Data_output = '0000000000000000000000000000000000000000000000000000'  # k tomu nic nevíme
Nevím, jak citlivé je to na obsah, ale zřejmě do toho tlačíš nesmyslná data.


Re:Python a dll pisane pre C+ nechcu papat bytearray
« Odpověď #5 kdy: 07. 03. 2021, 17:41:12 »
tecka:
takze dnu ma ist int ak tomu chapem spravne. ano?

tecka

Re:Python a dll pisane pre C+ nechcu papat bytearray
« Odpověď #6 kdy: 07. 03. 2021, 17:52:41 »
tecka:
takze dnu ma ist int ak tomu chapem spravne. ano?
Ne, int půjde ven (restype). A i tu strukturu bych udělal opravdu jako strukturu.
Psáno naslepo, netuším jestli to bude fungovat, ale třeba nějak takhle:
Kód: [Vybrat]
DFSD_DATA_BLOCK_SIZE = X
DFSD_DATA_BLOCK_SIG_SIZE = Y

DFSD_DATA_BLOCK = c_uint8 * DFSD_DATA_BLOCK_SIZE
DFSD_DSIG_BLOCK = c_uint8 * DFSD_DATA_BLOCK_SIG_SIZE

class tagData_t(Structure):
    _fields_ = [
        ("ddwUID", c_uint64),
        ("data", DFSD_DATA_BLOCK),
        ("signedData", DFSD_DSIG_BLOCK)
    ]

SignData = ...
SignData.argtypes = [POINTER(tagData_t)]
SignData.restype = c_int

...

myTagData = tagData_t()
myTagData.ddwUID = 0xD0021F673FC988F0
myTagData.data = DFSD_DATA_BLOCK(*b"nejakadata")

if SignData(byref(myTagData)) == DFSD_SIGN_OK:
    print(bytes(myTagData.signedData))

Re:Python a dll pisane pre C+ nechcu papat bytearray
« Odpověď #7 kdy: 07. 03. 2021, 18:15:35 »
Lebo co je problem je v tom ze on popisuje data struct ale vsetky vstupy su hexa skrz string.

tecka

Re:Python a dll pisane pre C+ nechcu papat bytearray
« Odpověď #8 kdy: 07. 03. 2021, 19:44:34 »
Lebo co je problem je v tom ze on popisuje data struct ale vsetky vstupy su hexa skrz string.
Já jsem všechny tvoje dotazy viděl. Problém je jen v tom, že netušíš, co děláš.

Re:Python a dll pisane pre C+ nechcu papat bytearray
« Odpověď #9 kdy: 08. 03. 2021, 09:13:25 »
tecka: ano to je mozne. V tomto pripade tak na 99,9% mas pravdu

Kazdopadne dnes som dostal verziu ktora to uz zvlada podla dokumentacie.