| poly1305.bdscr | poly1305a.bdscr | |||
|---|---|---|---|---|
| ## poly1305.bdscr | ## poly1305.bdscr | |||
| # Revision a | ||||
| ## Ref: "ChaCha20 and Poly1305 for IETF protocols" | ## Ref: "ChaCha20 and Poly1305 for IETF protocols" | |||
| ## Nir & Langley, January 19, 2015 | ## Nir & Langley, January 19, 2015 | |||
| ## <http://tools.ietf.org/html/draft-irtf-cfrg-chacha20-poly1305-08> | ## <http://tools.ietf.org/html/draft-irtf-cfrg-chacha20-poly1305-08> | |||
| ## Section 2.5.2. Poly1305 Example and Test Vector | ## Section 2.5.2. Poly1305 Example and Test Vector | |||
| # Set the constant prime "P" to be 2^130-5: | # Set the constant prime "P" to be 2^130-5: | |||
| P = (1<<130) - 5 | P = (1<<130) - 5 | |||
| # 1361129467683753853853498429727072845819 | # 1361129467683753853853498429727072845819 | |||
| printf("Prime, P: %x\n", P) | printf("Prime, P: %x\n", P) | |||
| # 0x3fffffffffffffffffffffffffffffffb | # 0x3fffffffffffffffffffffffffffffffb | |||
| skipping to change at line 45 | skipping to change at line 47 | |||
| r = revbytes(r, 128/8) | r = revbytes(r, 128/8) | |||
| printf("r as 128-bit number: 0x%x\n", r) | printf("r as 128-bit number: 0x%x\n", r) | |||
| # clamp r | # clamp r | |||
| r = r band 0x0ffffffc0ffffffc0ffffffc0fffffff | r = r band 0x0ffffffc0ffffffc0ffffffc0fffffff | |||
| printf("r after clamping : 0x%x\n", r) | printf("r after clamping : 0x%x\n", r) | |||
| puts( "(Correct r : 0x806d5400e52447c036d555408bed685)") | puts( "(Correct r : 0x806d5400e52447c036d555408bed685)") | |||
| # Message to be Authenticated in network order | # Message to be Authenticated in network order | |||
| msg = 0x43727970746f6772617068696320466f72756d2052657365617263682047726f7570 | msg = 0x43727970746f6772617068696320466f72756d2052657365617263682047726f7570 | |||
| mbytes = bytelen(msg) # Careful if have leading zero bytes | mbytes = bytelen(msg) # Caution: hardcode this if have leading zero bytes in msg | |||
| nblocks = (mbytes + 15) / 16 | nblocks = (mbytes + 15) / 16 | |||
| printf("Message in network order:\n [%x]\n", msg) | printf("Message in network order:\n [%x]\n", msg) | |||
| println("msg length in bytes = ", mbytes, " => ", nblocks, " blocks") | println("msg length in bytes = ", mbytes, " => ", nblocks, " blocks") | |||
| # Reverse order of message bytes then take in blocks of 128 bits | # Reverse order of message bytes then take in blocks of 128 bits | |||
| msg = revbytes(msg, bytelen(msg)) | msg = revbytes(msg, mbytes) | |||
| !msg | printf("Message in LE order:\n [%x]\n", msg) | |||
| # Use count of bytes to avoid leading zero byte issue | ||||
| nleft = mbytes | ||||
| # set a variable "accumulator" to zero | # set a variable "accumulator" to zero | |||
| acc = 0 | acc = 0 | |||
| # Loop through each block of 16 bytes (128 bits) | # Loop through each block of 16 bytes (128 bits) | |||
| for i in (1..nblocks) do | for i in (1..nblocks) do | |||
| printf("Acc = %x\n", acc); | printf("Acc = %x\n", acc); | |||
| # Get next 16 bytes from RHS | ||||
| block = msg & mask128; | block = msg & mask128; | |||
| printf("Block = %x\n", block); | printf("Block = %x\n", block); | |||
| block = (0x01 << (bytelen(block))*8) | block; | # Add leading 0x01 byte | |||
| blklen = min(nleft, 16); | ||||
| nleft = nleft - blklen; | ||||
| block = (0x01 << (blklen)*8) | block; | ||||
| printf("Block with 0x01 byte = %x\n", block); | printf("Block with 0x01 byte = %x\n", block); | |||
| # debug values | # debug values | |||
| printf("Acc + block = = %x\n", acc + block); | printf("Acc + block = = %x\n", acc + block); | |||
| printf("(Acc + Block) * r =\n\t%x\n", (acc + block) * r); | printf("(Acc + Block) * r =\n\t%x\n", (acc + block) * r); | |||
| # do calc in one line | # Do main calc in one line | |||
| acc = ((acc+block)*r) mod P; | acc = ((acc+block)*r) mod P; | |||
| printf("((Acc + Block) * r) %% P = %x\n", acc); | printf("((Acc + Block) * r) %% P = %x\n", acc); | |||
| # Shift message block by 16 bytes | # Shift message block by 16 bytes | |||
| msg = msg >> 128; | msg = msg >> 128; | |||
| done | done | |||
| tag = acc + s | tag = acc + s | |||
| # 905406785994486245610219399192143267496 | # 905406785994486245610219399192143267496 | |||
| # Tag as a little-endian number: | # Tag as a little-endian number: | |||
| printf("Acc + s = %x\n", tag) | printf("Acc + s = %x\n", tag) | |||
| End of changes. 6 change blocks. | ||||
| 5 lines changed or deleted | 14 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||