Zero-Padding zu einem Array hinzufügen

8

Ich mache einen GHASH für die AES-GCM-Implementierung.

und ich muss dies umsetzen

Dabei ist v die Bitlänge des letzten Blocks von A, u ist die Bitlänge des letzten Blocks von C und || bezeichnet die Verkettung von Bitfolgen.

Wie kann ich die Verkettung eines A-Blocks machen, um den Nullenabstand von v bis 128 Bit zu füllen, da ich die Länge des ganzen Blocks von A nicht kenne. Also nehme ich einfach den A-Block und XOR es mit einem Array von 128 Bits

%Vor%

Ich bin mir ziemlich sicher, dass ich nicht korrekt bin. Aber ich habe keine Ahnung, wie es geht.

    
Anne 27.11.2013, 16:32
quelle

2 Antworten

4

Wenn Sie sich nicht um jedes bisschen Effizienz kümmern (ich nehme an, das ist zu experimentieren, und nicht für den wirklichen Gebrauch?) einfach neu zuweisen und auffüllen (in der Praxis könnten Sie runden und Calloc wenn Sie diese zuerst erklären) :

%Vor%

Haftungsausschluss - kein Experte, hat nur die Spezifikation überflogen. Code nicht kompiliert, nicht geprüft und nicht für "echte" Verwendung gedacht. Außerdem unterstützt die Spezifikation beliebige (Bit-) Längen, aber ich nehme an, dass Sie in Bytes arbeiten.

Ich bin mir immer noch nicht sicher, ob ich die richtige Frage beantworte.

    
andrew cooke 30.11.2013 22:44
quelle
4

Es scheint mir, dass Sie hier einige Probleme haben, und ihre Zusammenführung ist ein großer Teil des Problems. Es wird viel einfacher sein, wenn Sie sie trennen.

  • Erstens: die Übergabe eines Parameters der Form uint8_t len_A, uint8_t A_i[len_A] ist keine richtige Syntax und gibt Ihnen nicht, was Sie wollen. Sie erhalten tatsächlich uint8_t len_A, uint8_t * A_i , und die Länge von A_i wird dadurch bestimmt, wie es auf der obigen Ebene deklariert wurde und nicht wie Sie es übergeben haben. (Beachten Sie, dass uint8_t * A und uint8_t A[] hier identisch sind; der Unterschied ist meistens syntaktischer Zucker für den Programmierer.)

  • Da ich auf der obigen Ebene nicht weiß, ob es von malloc () oder auf dem Stack deklariert wurde, werde ich keine Probleme mit der Speicherverwaltung bekommen. Ich werde den lokalen Speicher für meinen Vorschlag verwenden.

  • Klarheit der Einheit: Sie haben hier einen schlimmen Fall: Bit vs. Byte vs. Blocklänge. Ohne den Kernalgorithmus zu kennen, scheint es mir, dass die nicht deklarierte m & amp; n sind Blocklängen von A & amp; C; h. A ist m Blöcke lang und C ist n Blöcke lang, und in beiden Fällen muss der letzte Block nicht die volle Länge aufweisen. Du gibst len_A & amp; len_C, ohne uns mitzuteilen (oder sie im Code zu verwenden, damit wir sehen können), ob sie die Bitlänge u / v, die Bytelänge von A_i / C_i oder die Gesamtlänge von A / C in Bits oder Bytes oder Blöcken sind. Basierend auf der (falschen) Deklaration nehme ich an, dass sie die Länge von A_i / C_i in Bytes sind, aber es ist nicht offensichtlich ... und es ist auch nicht offensichtlich, dass sie übergeben wird. Mit dem Namen hätte ich es als die Länge von A / C in Bits erraten. Hinweis: Wenn sich Ihre Einheiten in den Namen befinden, wird es offensichtlich, wenn Sie versuchen, bitLenA zu ByteLenB hinzuzufügen.

  • Iterationskontrolle: Sie scheinen für die i-te Iteration 16-Byte-Blöcke zu übergeben, aber nicht i. Entweder gebe ich ein oder gebe die volle A & amp; C anstelle von A_i & amp; C_i. Sie verwenden auch m & amp; n ohne sie zu setzen oder sie weiterzugeben; Das gleiche Problem wurde angewendet. Ich werde nur so tun, als wären sie alle im Moment der Verwendung korrekt und lassen Sie das beheben.

  • Schließlich verstehe ich nicht die Summennotation für den Fall i = m + n + 1, insbesondere wie len (A) & amp; len (C) werden behandelt, aber Sie fragen nicht nach diesem Fall, also werde ich es ignorieren.

Wenn wir all das betrachten, sehen wir uns Ihre Funktion an:

%Vor%

Wir kopieren nur Speicher im letzten Block von A oder C und verwenden den lokalen Speicher für die Kopie. Die meisten Blöcke werden mit einer einzelnen Zeigerkopie behandelt, um auf das richtige Bit des Eingabespeichers zu zeigen.

    
Erik Johnson 05.12.2013 23:20
quelle

Tags und Links