siDDis Skrevet 19. februar 2014 Del Skrevet 19. februar 2014 (endret) Eg driver å kikker på blake2 implementasjonen i C. Målet er å lage ein JNI wrapper til C koden etterkvart. Funksjoner eg har tenkt å mappe i første omgang er blake2s_init() blake2s_update() blake2s_final() Men eg sliter litt med å forstå korleis init metoden fungerer. I b2sum.c eksempelet som eg studerer så ser eg følgende blake2s_init( S, BLAKE2S_OUTBYTES ); BLAKE2S_OUTBYTES er grei, den er deklarert i ein enum i blake2.h men S'en? I c fila så finner eg den deklarert som dette: blake2s_state S[1]; Er det relatert til dette i blake2.h fila? ALIGN( 64 ) typedef struct __blake2s_state { uint64_t h[8]; uint64_t t[2]; uint64_t f[2]; uint8_t buf[2 * BLAKE2B_BLOCKBYTES]; size_t buflen; uint8_t last_node; } blake2s_state; Endret 19. februar 2014 av siDDis Lenke til kommentar
Emancipate Skrevet 19. februar 2014 Del Skrevet 19. februar 2014 Dette blir litt som å dra ut setningen "og deretter gikk han" fra en 250 sider lang bok og spørre oss hvem han var og hvor han gikk. Er det relatert til dette i blake2.h fila?Hvis dette er spørsmålet ditt (og det eneste spørsmålet), så er svaret ja. Lenke til kommentar
Lycantrophe Skrevet 19. februar 2014 Del Skrevet 19. februar 2014 (endret) Tipper det er state-bufferen den skal operere på. I en del tilfeller er det ansett som god stil å la brukeren selv styre hvordan minne allokeres, og bare utføre operasjoner på brukerallokerte buffere. Tipper S er denne bufferen. edit: slo opp headerfilen. int blake2s_init( blake2s_state *S, const uint8_t outlen ); Altså state-bufferen. Endret 19. februar 2014 av Lycantrophe 1 Lenke til kommentar
siDDis Skrevet 20. februar 2014 Forfatter Del Skrevet 20. februar 2014 Akkurat, så då betyr ALIGN(64) at denne structen så skal den alltid bruke 64 bytes? Lenke til kommentar
Lycantrophe Skrevet 20. februar 2014 Del Skrevet 20. februar 2014 (endret) Ja. Det er en macro (for multicompiler support) for å aligne structen til 64 bytes. https://ohse.de/uwe/articles/gcc-attributes.html#type-aligned edit: that being said er det antagelig ikke noe du skal trenge å bry deg om for å skrive wrappers (eller forstå noe). Det er en mulig optimalisering, og det er det. Endret 20. februar 2014 av Lycantrophe 1 Lenke til kommentar
Emancipate Skrevet 20. februar 2014 Del Skrevet 20. februar 2014 Sannsynligvis er det viktig at den er aligned på 64 dersom du kompilerer til et 64-bit system. Dette fordi enkelte instruksjoner kun virker på adresser som er aligned. Nå vet jeg jo ikke om programmet bruker slike instruksjoner, men sannsynligvis gjør det det, eller så ville de ikke brydd seg med å aligne structen. Jeg tviler på at det er en valgfri optimalisering. Instruksjoner som ikke trenger aligned data går som regel like fort om man gir den aligned data eller ikke. Så typisk vil det være enten absolutt nødvendig at structen er aligned eller helt unødvendig. Lenke til kommentar
Lycantrophe Skrevet 20. februar 2014 Del Skrevet 20. februar 2014 (endret) Nesten alt på x86 er alignet på 8bit, så det gir fint mening å padde deretter. gcc gjør det ofte på egenhånd og. C++ har en standardisert måte å gjøre dette på (std::aligned_storage eller så) som aligner automatisk til den underliggende platformen. Endret 20. februar 2014 av Lycantrophe Lenke til kommentar
Emancipate Skrevet 20. februar 2014 Del Skrevet 20. februar 2014 Nesten alt på x86 er alignet på 8bit, så det gir fint mening å padde deretter. gcc gjør det ofte på egenhånd og.Alt på x86 er alignet på (minst) 8 bit, her var det snakk om å aligne på 64 bit. Noe som kan være nødvendig hvis programmet bruker noen inline assembly-instruksjoner som trenger dette. GCC aligner på 64 bit automatisk ved behov stadig vekk, f.eks. om den selv generere instruksjoner som trenger det og andre årsaker, men GCC vet ikke at/om dette er nødvendig hvis man har brukt inline assembly. Lenke til kommentar
Lycantrophe Skrevet 20. februar 2014 Del Skrevet 20. februar 2014 Ah, det du sikter til, ja. Lenke til kommentar
Emancipate Skrevet 20. februar 2014 Del Skrevet 20. februar 2014 Den bruker visst "intrinsics" istedenfor inline ASM, men jeg tror det samme gjelder. For å unngå trøbbel er det kanskje smart å starte med reference-implementasjonen i ref\ og ikke den optimaliserte i sse\. Da unngår man denne type problemstillinger. Lenke til kommentar
siDDis Skrevet 20. februar 2014 Forfatter Del Skrevet 20. februar 2014 Jada, starter med ref først. Viktigst å få ting til å fungere før eg gjer det meir avansert Prøver å forstå ein anna linje her nå. I main metoden til b2sum.c så blir hash deklarert på følgjande måte: unsigned char hash[BLAKE2B_OUTBYTES] = {0}; Kva betyr {0}? Lenke til kommentar
Lycantrophe Skrevet 20. februar 2014 Del Skrevet 20. februar 2014 (endret) Det er 0-initialisering. Det er ekvivalent med: unsigned char hash[ BLAKE2B_OUTBYTES ]; memset( hash, 0, BLAKE2B_OUTBYTES ); Endret 20. februar 2014 av Lycantrophe Lenke til kommentar
siDDis Skrevet 20. februar 2014 Forfatter Del Skrevet 20. februar 2014 (endret) aha, blir forvirra av alle disse forskjellige måtene å gjere ting på Tusen takk for hjelpa forresten Endret 20. februar 2014 av siDDis Lenke til kommentar
Lycantrophe Skrevet 20. februar 2014 Del Skrevet 20. februar 2014 { 0 }-syntax kan bare brukes på stack-objekter, men det er ganske nifty til det. Ingen grunn til å blande inn eksplisitt memset. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå