Gå til innhold

Kva er dette i C?


Anbefalte innlegg

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 av siDDis
Lenke til kommentar
Videoannonse
Annonse

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 av Lycantrophe
  • Liker 1
Lenke til kommentar

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

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 av Lycantrophe
Lenke til kommentar

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

Jada, starter med ref først. Viktigst å få ting til å fungere før eg gjer det meir avansert :p

 

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...