commonware-cryptography 2026.10.0

Generate keys, sign arbitrary messages, and deterministically verify signatures.
Documentation
            .macro LOAD_ROW dst, offset
            mov rax, qword ptr [r8 + \offset]
            vmovdqu32 \dst, zmmword ptr [rax]
            add rax, 64
            mov qword ptr [r8 + \offset], rax
            .endm

            .macro PAIR_DWORDS lo, hi
            vpunpckldq zmm0, \lo, \hi
            vpunpckhdq \hi, \lo, \hi
            vmovdqa32 \lo, zmm0
            .endm

            .macro TRANSPOSE_QUARTER out0, out4, out8, out12
            vshufi32x4 zmm0, \out0, \out8, 0x44
            vshufi32x4 zmm1, \out0, \out8, 0xee
            vshufi32x4 zmm2, \out4, \out12, 0x44
            vshufi32x4 zmm3, \out4, \out12, 0xee
            vshufi32x4 \out0, zmm0, zmm2, 0x88
            vshufi32x4 \out4, zmm0, zmm2, 0xdd
            vshufi32x4 \out8, zmm1, zmm3, 0x88
            vshufi32x4 \out12, zmm1, zmm3, 0xdd
            .endm

            .macro TRANSPOSE_16
            PAIR_DWORDS zmm16, zmm17
            PAIR_DWORDS zmm18, zmm19
            PAIR_DWORDS zmm20, zmm21
            PAIR_DWORDS zmm22, zmm23
            PAIR_DWORDS zmm24, zmm25
            PAIR_DWORDS zmm26, zmm27
            PAIR_DWORDS zmm28, zmm29
            PAIR_DWORDS zmm30, zmm31

            vpunpcklqdq zmm0, zmm16, zmm18
            vpunpckhqdq zmm1, zmm16, zmm18
            vpunpcklqdq zmm2, zmm17, zmm19
            vpunpckhqdq zmm3, zmm17, zmm19
            vmovdqa32 zmm16, zmm0
            vmovdqa32 zmm17, zmm1
            vmovdqa32 zmm18, zmm2
            vmovdqa32 zmm19, zmm3

            vpunpcklqdq zmm0, zmm28, zmm30
            vpunpckhqdq zmm1, zmm28, zmm30
            vpunpcklqdq zmm2, zmm29, zmm31
            vpunpckhqdq zmm3, zmm29, zmm31
            vmovdqa32 zmm28, zmm0
            vmovdqa32 zmm29, zmm1
            vmovdqa32 zmm30, zmm2
            vmovdqa32 zmm31, zmm3

            vpunpcklqdq zmm0, zmm20, zmm22
            vpunpckhqdq zmm1, zmm20, zmm22
            vpunpcklqdq zmm2, zmm21, zmm23
            vpunpckhqdq zmm3, zmm21, zmm23
            vpunpcklqdq zmm4, zmm24, zmm26
            vpunpckhqdq zmm5, zmm24, zmm26
            vpunpcklqdq zmm6, zmm25, zmm27
            vpunpckhqdq zmm7, zmm25, zmm27
            vmovdqa32 zmm24, zmm0
            vmovdqa32 zmm25, zmm1
            vmovdqa32 zmm26, zmm2
            vmovdqa32 zmm27, zmm3
            vmovdqa32 zmm20, zmm4
            vmovdqa32 zmm21, zmm5
            vmovdqa32 zmm22, zmm6
            vmovdqa32 zmm23, zmm7

            TRANSPOSE_QUARTER zmm16, zmm20, zmm24, zmm28
            TRANSPOSE_QUARTER zmm17, zmm21, zmm25, zmm29
            TRANSPOSE_QUARTER zmm18, zmm22, zmm26, zmm30
            TRANSPOSE_QUARTER zmm19, zmm23, zmm27, zmm31
            .endm

            .macro SHA256_ROUND a, b, c, d, e, f, g, h, word
            vpaddd zmm8, \h, \word
            vpaddd zmm8, zmm8, dword ptr [r9]{{1to16}}
            add r9, 4

            vprord zmm9, \e, 6
            vprord zmm10, \e, 11
            vprord zmm11, \e, 25
            vpternlogd zmm9, zmm10, zmm11, 0x96
            vpaddd zmm8, zmm8, zmm9

            vmovdqa32 zmm9, \e
            vpternlogd zmm9, \f, \g, 0xca
            vpaddd zmm8, zmm8, zmm9

            vprord zmm9, \a, 2
            vprord zmm10, \a, 13
            vprord zmm11, \a, 22
            vpternlogd zmm9, zmm10, zmm11, 0x96

            vmovdqa32 zmm10, \a
            vpternlogd zmm10, \b, \c, 0xe8
            vpaddd zmm9, zmm9, zmm10

            vpaddd \d, \d, zmm8
            vpaddd \h, zmm8, zmm9
            .endm

            .macro ROUNDS_8 w0, w1, w2, w3, w4, w5, w6, w7
            SHA256_ROUND zmm0, zmm1, zmm2, zmm3, zmm4, zmm5, zmm6, zmm7, \w0
            SHA256_ROUND zmm7, zmm0, zmm1, zmm2, zmm3, zmm4, zmm5, zmm6, \w1
            SHA256_ROUND zmm6, zmm7, zmm0, zmm1, zmm2, zmm3, zmm4, zmm5, \w2
            SHA256_ROUND zmm5, zmm6, zmm7, zmm0, zmm1, zmm2, zmm3, zmm4, \w3
            SHA256_ROUND zmm4, zmm5, zmm6, zmm7, zmm0, zmm1, zmm2, zmm3, \w4
            SHA256_ROUND zmm3, zmm4, zmm5, zmm6, zmm7, zmm0, zmm1, zmm2, \w5
            SHA256_ROUND zmm2, zmm3, zmm4, zmm5, zmm6, zmm7, zmm0, zmm1, \w6
            SHA256_ROUND zmm1, zmm2, zmm3, zmm4, zmm5, zmm6, zmm7, zmm0, \w7
            .endm

            .macro SCHEDULE dst, w15, w7, w2
            vprord zmm12, \w2, 17
            vprord zmm13, \w2, 19
            vpsrld zmm14, \w2, 10
            vpternlogd zmm12, zmm13, zmm14, 0x96

            vprord zmm13, \w15, 7
            vprord zmm14, \w15, 18
            vpsrld zmm11, \w15, 3
            vpternlogd zmm13, zmm14, zmm11, 0x96

            vpaddd \dst, \dst, \w7
            vpaddd \dst, \dst, zmm12
            vpaddd \dst, \dst, zmm13
            .endm

            .macro SCHEDULE_ROUNDS_16
            SCHEDULE zmm16, zmm17, zmm25, zmm30
            SHA256_ROUND zmm0, zmm1, zmm2, zmm3, zmm4, zmm5, zmm6, zmm7, zmm16
            SCHEDULE zmm17, zmm18, zmm26, zmm31
            SHA256_ROUND zmm7, zmm0, zmm1, zmm2, zmm3, zmm4, zmm5, zmm6, zmm17
            SCHEDULE zmm18, zmm19, zmm27, zmm16
            SHA256_ROUND zmm6, zmm7, zmm0, zmm1, zmm2, zmm3, zmm4, zmm5, zmm18
            SCHEDULE zmm19, zmm20, zmm28, zmm17
            SHA256_ROUND zmm5, zmm6, zmm7, zmm0, zmm1, zmm2, zmm3, zmm4, zmm19
            SCHEDULE zmm20, zmm21, zmm29, zmm18
            SHA256_ROUND zmm4, zmm5, zmm6, zmm7, zmm0, zmm1, zmm2, zmm3, zmm20
            SCHEDULE zmm21, zmm22, zmm30, zmm19
            SHA256_ROUND zmm3, zmm4, zmm5, zmm6, zmm7, zmm0, zmm1, zmm2, zmm21
            SCHEDULE zmm22, zmm23, zmm31, zmm20
            SHA256_ROUND zmm2, zmm3, zmm4, zmm5, zmm6, zmm7, zmm0, zmm1, zmm22
            SCHEDULE zmm23, zmm24, zmm16, zmm21
            SHA256_ROUND zmm1, zmm2, zmm3, zmm4, zmm5, zmm6, zmm7, zmm0, zmm23
            SCHEDULE zmm24, zmm25, zmm17, zmm22
            SHA256_ROUND zmm0, zmm1, zmm2, zmm3, zmm4, zmm5, zmm6, zmm7, zmm24
            SCHEDULE zmm25, zmm26, zmm18, zmm23
            SHA256_ROUND zmm7, zmm0, zmm1, zmm2, zmm3, zmm4, zmm5, zmm6, zmm25
            SCHEDULE zmm26, zmm27, zmm19, zmm24
            SHA256_ROUND zmm6, zmm7, zmm0, zmm1, zmm2, zmm3, zmm4, zmm5, zmm26
            SCHEDULE zmm27, zmm28, zmm20, zmm25
            SHA256_ROUND zmm5, zmm6, zmm7, zmm0, zmm1, zmm2, zmm3, zmm4, zmm27
            SCHEDULE zmm28, zmm29, zmm21, zmm26
            SHA256_ROUND zmm4, zmm5, zmm6, zmm7, zmm0, zmm1, zmm2, zmm3, zmm28
            SCHEDULE zmm29, zmm30, zmm22, zmm27
            SHA256_ROUND zmm3, zmm4, zmm5, zmm6, zmm7, zmm0, zmm1, zmm2, zmm29
            SCHEDULE zmm30, zmm31, zmm23, zmm28
            SHA256_ROUND zmm2, zmm3, zmm4, zmm5, zmm6, zmm7, zmm0, zmm1, zmm30
            SCHEDULE zmm31, zmm16, zmm24, zmm29
            SHA256_ROUND zmm1, zmm2, zmm3, zmm4, zmm5, zmm6, zmm7, zmm0, zmm31
            .endm

            test {blocks}, {blocks}
            jz 9f
2:
            mov r8, {data}
            LOAD_ROW zmm16, 0
            LOAD_ROW zmm17, 8
            LOAD_ROW zmm18, 16
            LOAD_ROW zmm19, 24
            LOAD_ROW zmm20, 32
            LOAD_ROW zmm21, 40
            LOAD_ROW zmm22, 48
            LOAD_ROW zmm23, 56
            LOAD_ROW zmm24, 64
            LOAD_ROW zmm25, 72
            LOAD_ROW zmm26, 80
            LOAD_ROW zmm27, 88
            LOAD_ROW zmm28, 96
            LOAD_ROW zmm29, 104
            LOAD_ROW zmm30, 112
            LOAD_ROW zmm31, 120

            TRANSPOSE_16

            vmovdqu8 ymm15, ymmword ptr [{mask}]
            vshufi32x4 zmm15, zmm15, zmm15, 0x44
            vpshufb zmm16, zmm16, zmm15
            vpshufb zmm17, zmm17, zmm15
            vpshufb zmm18, zmm18, zmm15
            vpshufb zmm19, zmm19, zmm15
            vpshufb zmm20, zmm20, zmm15
            vpshufb zmm21, zmm21, zmm15
            vpshufb zmm22, zmm22, zmm15
            vpshufb zmm23, zmm23, zmm15
            vpshufb zmm24, zmm24, zmm15
            vpshufb zmm25, zmm25, zmm15
            vpshufb zmm26, zmm26, zmm15
            vpshufb zmm27, zmm27, zmm15
            vpshufb zmm28, zmm28, zmm15
            vpshufb zmm29, zmm29, zmm15
            vpshufb zmm30, zmm30, zmm15
            vpshufb zmm31, zmm31, zmm15

            vmovdqu32 zmm0, zmmword ptr [{state}]
            vmovdqu32 zmm1, zmmword ptr [{state} + 64]
            vmovdqu32 zmm2, zmmword ptr [{state} + 128]
            vmovdqu32 zmm3, zmmword ptr [{state} + 192]
            vmovdqu32 zmm4, zmmword ptr [{state} + 256]
            vmovdqu32 zmm5, zmmword ptr [{state} + 320]
            vmovdqu32 zmm6, zmmword ptr [{state} + 384]
            vmovdqu32 zmm7, zmmword ptr [{state} + 448]
            mov r9, {k}

            ROUNDS_8 zmm16, zmm17, zmm18, zmm19, zmm20, zmm21, zmm22, zmm23
            ROUNDS_8 zmm24, zmm25, zmm26, zmm27, zmm28, zmm29, zmm30, zmm31
            SCHEDULE_ROUNDS_16
            SCHEDULE_ROUNDS_16
            SCHEDULE_ROUNDS_16

            vpaddd zmm0, zmm0, zmmword ptr [{state}]
            vpaddd zmm1, zmm1, zmmword ptr [{state} + 64]
            vpaddd zmm2, zmm2, zmmword ptr [{state} + 128]
            vpaddd zmm3, zmm3, zmmword ptr [{state} + 192]
            vpaddd zmm4, zmm4, zmmword ptr [{state} + 256]
            vpaddd zmm5, zmm5, zmmword ptr [{state} + 320]
            vpaddd zmm6, zmm6, zmmword ptr [{state} + 384]
            vpaddd zmm7, zmm7, zmmword ptr [{state} + 448]
            vmovdqu32 zmmword ptr [{state}], zmm0
            vmovdqu32 zmmword ptr [{state} + 64], zmm1
            vmovdqu32 zmmword ptr [{state} + 128], zmm2
            vmovdqu32 zmmword ptr [{state} + 192], zmm3
            vmovdqu32 zmmword ptr [{state} + 256], zmm4
            vmovdqu32 zmmword ptr [{state} + 320], zmm5
            vmovdqu32 zmmword ptr [{state} + 384], zmm6
            vmovdqu32 zmmword ptr [{state} + 448], zmm7

            dec {blocks}
            jnz 2b
9:
            vzeroupper

            .purgem LOAD_ROW
            .purgem PAIR_DWORDS
            .purgem TRANSPOSE_QUARTER
            .purgem TRANSPOSE_16
            .purgem SHA256_ROUND
            .purgem ROUNDS_8
            .purgem SCHEDULE
            .purgem SCHEDULE_ROUNDS_16