.section .data sha256_keys: ## Needs to be reversed. .long 0x428a2f98 .long 0x71374491 .long 0xb5c0fbcf .long 0xe9b5dba5 .long 0x3956c25b .long 0x59f111f1 .long 0x923f82a4 .long 0xab1c5ed5 .long 0xd807aa98 .long 0x12835b01 .long 0x243185be .long 0x550c7dc3 .long 0x72be5d74 .long 0x80deb1fe .long 0x9bdc06a7 .long 0xc19bf174 .long 0xe49b69c1 .long 0xefbe4786 .long 0x0fc19dc6 .long 0x240ca1cc .long 0x2de92c6f .long 0x4a7484aa .long 0x5cb0a9dc .long 0x76f988da .long 0x983e5152 .long 0xa831c66d .long 0xb00327c8 .long 0xbf597fc7 .long 0xc6e00bf3 .long 0xd5a79147 .long 0x06ca6351 #.long 0xd5a79147 #.long 0x06ca6351 .long 0x14292967 .long 0x27b70a85 .long 0x2e1b2138 .long 0x4d2c6dfc .long 0x53380d13 .long 0x650a7354 .long 0x766a0abb .long 0x81c2c92e .long 0x92722c85 .long 0xa2bfe8a1 .long 0xa81a664b .long 0xc24b8b70 .long 0xc76c51a3 .long 0xd192a819 .long 0xd6990624 .long 0xf40e3585 .long 0x106aa070 .long 0x19a4c116 .long 0x1e376c08 .long 0x2748774c .long 0x34b0bcb5 .long 0x391c0cb3 .long 0x4ed8aa4a .long 0x5b9cca4f .long 0x682e6ff3 .long 0x748f82ee .long 0x78a5636f .long 0x84c87814 .long 0x8cc70208 .long 0x90befffa .long 0xa4506ceb .long 0xbef9a3f7 .long 0xc67178f2 sha256_h: .long 0x6a09e667 .long 0xbb67ae85 .long 0x3c6ef372 .long 0xa54ff53a .long 0x510e527f .long 0x9b05688c .long 0x1f83d9ab .long 0x5be0cd19 sha256_data: .long 0x00000080 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .section .text .globl _start # Arguments # %r8 - *hash # %r9 - *data sha256_transform: mov %rsp, %rbp sub $64, %rsp mov $16, %al sha256_transform_init: mov -4(%r9, %rax, 4), %ebx bswap %ebx mov %ebx, -4(%rsp, %rax, 4) dec %al jnz sha256_transform_init mov (%r8), %ebx mov 4(%r8), %r9d mov 8(%r8), %r10d mov 12(%r8), %r11d mov 16(%r8), %r12d mov 20(%r8), %r13d mov 24(%r8), %r14d mov 28(%r8), %r15d sha256_transform_loop: # Process. add %r15d, %r11d #add %r15d, %r15d #mov %r9d, %edx #mov %r9d, %ecx #mov %r10d, %edi #xor %ebx, %edx #and %ebx, %ecx #and %edx, %edi #or %edi, %ecx #add %ecx, %r15d mov %ebx, %ecx mov %ebx, %edx ror $2, %ecx ror $13, %edx xor %edx, %ecx mov %ebx, %edx ror $22, %edx xor %edx, %ecx add %ecx, %r15d mov %r12d, %ecx mov %r12d, %edx ror $6, %ecx ror $11, %edx xor %edx, %ecx mov %r12d, %edx ror $25, %edx xor %edx, %ecx mov %r13d, %edx xor %r14d, %edx and %r12d, %edx xor %r14d, %edx add %edx, %ecx mov %rax, %rdx and $0x0F, %rdx add (%rsp, %rdx, 4), %ecx add sha256_keys(, %rax, 4), %ecx add %ecx, %r11d add %ecx, %r15d # Extend. #mov %rax, %rcx #inc %cl #and $0x0F, %cl #mov (%rsp, %rcx, 4), %edx #mov %edx, %edi #mov %edx, %esi #ror $7, %edx #ror $18, %edi #shr $3, %esi #xor %edi, %edx #xor %esi, %edx #sub $3, %cl #and $0x0F, %cl #mov (%rsp, %rcx, 4), %ecx #mov %ecx, %edi #mov %ecx, %esi #ror $17, %ecx #ror $19, %edi #shr $10, %esi #xor %edi, %ecx #xor %esi, %ecx #add %ecx, %edx #mov %eax, %ecx #sub $7, %cl #and $0x0F, %cl #add (%rsp, %rcx, 4), %edx #mov %al, %cl #and $0x0F, %cl #add %edx, (%rsp, %rcx, 4) # Rotate state. mov %r15d, %ecx mov %r14d, %r15d mov %r13d, %r14d mov %r12d, %r13d mov %r11d, %r12d mov %r10d, %r11d mov %r9d, %r10d mov %ebx, %r9d mov %ecx, %ebx inc %al cmp $64, %al jl sha256_transform_loop add %ebx, (%r8) add %r9d, 4(%r8) add %r10d, 8(%r8) add %r11d, 12(%r8) add %r12d, 16(%r8) add %r13d, 20(%r8) add %r14d, 24(%r8) add %r15d, 28(%r8) mov %rbp, %rsp ret _start: mov $0x00FFFFFF, %rsi loop: push %rsi mov $sha256_h, %r8 mov $sha256_data, %r9 call sha256_transform pop %rsi dec %rsi jnz loop xor %eax, %eax inc %eax xor %ebx, %ebx int $0x80