mirror of
https://github.com/sheumann/65816-crypto.git
synced 2024-11-25 10:30:45 +00:00
253 lines
4.0 KiB
NASM
253 lines
4.0 KiB
NASM
* Copyright (c) 2017 Stephen Heumann
|
|
*
|
|
* Permission to use, copy, modify, and distribute this software for any
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
* copyright notice and this permission notice appear in all copies.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
|
|
* Implementation of the SHA-256 (and SHA-224) hash function for the 65816
|
|
*
|
|
* The basic structure of the hash computation is described in FIPS PUB 180-4,
|
|
* although this implementation rearranges some things for better performance.
|
|
|
|
case on
|
|
mcopy sha256.macros
|
|
|
|
* Direct page locations
|
|
length gequ 0
|
|
extra gequ 8
|
|
idx gequ 10
|
|
a_ gequ 12 ; elements of state
|
|
b gequ 16
|
|
c gequ 20
|
|
d gequ 24
|
|
e gequ 28
|
|
f gequ 32
|
|
g gequ 36
|
|
h gequ 40
|
|
temp1 gequ 44
|
|
temp2 gequ 48
|
|
ch gequ 52
|
|
maj gequ 56
|
|
h0 gequ 60
|
|
h1 gequ 64
|
|
h2 gequ 68
|
|
h3 gequ 72
|
|
h4 gequ 76
|
|
h5 gequ 80
|
|
h6 gequ 84
|
|
h7 gequ 88
|
|
w gequ 92
|
|
temp3 gequ 156
|
|
temp4 gequ 160
|
|
k_ptr gequ 164
|
|
|
|
|
|
k private
|
|
dc i4'$428a2f98, $71374491, $b5c0fbcf, $e9b5dba5'
|
|
dc i4'$3956c25b, $59f111f1, $923f82a4, $ab1c5ed5'
|
|
dc i4'$d807aa98, $12835b01, $243185be, $550c7dc3'
|
|
dc i4'$72be5d74, $80deb1fe, $9bdc06a7, $c19bf174'
|
|
dc i4'$e49b69c1, $efbe4786, $0fc19dc6, $240ca1cc'
|
|
dc i4'$2de92c6f, $4a7484aa, $5cb0a9dc, $76f988da'
|
|
dc i4'$983e5152, $a831c66d, $b00327c8, $bf597fc7'
|
|
dc i4'$c6e00bf3, $d5a79147, $06ca6351, $14292967'
|
|
dc i4'$27b70a85, $2e1b2138, $4d2c6dfc, $53380d13'
|
|
dc i4'$650a7354, $766a0abb, $81c2c92e, $92722c85'
|
|
dc i4'$a2bfe8a1, $a81a664b, $c24b8b70, $c76c51a3'
|
|
dc i4'$d192e819, $d6990624, $f40e3585, $106aa070'
|
|
dc i4'$19a4c116, $1e376c08, $2748774c, $34b0bcb5'
|
|
dc i4'$391c0cb3, $4ed8aa4a, $5b9cca4f, $682e6ff3'
|
|
dc i4'$748f82ee, $78a5636f, $84c87814, $8cc70208'
|
|
dc i4'$90befffa, $a4506ceb, $bef9a3f7, $c67178f2'
|
|
end
|
|
|
|
* Initialize a SHA-256 context.
|
|
* This must be called before any of the other SHA-256 functions.
|
|
sha256_init start
|
|
CFunction SHA256_INIT
|
|
end
|
|
|
|
SHA256_INIT start
|
|
lda #$e667
|
|
sta h0
|
|
lda #$6a09
|
|
sta h0+2
|
|
lda #$ae85
|
|
sta h1
|
|
lda #$bb67
|
|
sta h1+2
|
|
lda #$f372
|
|
sta h2
|
|
lda #$3c6e
|
|
sta h2+2
|
|
lda #$f53a
|
|
sta h3
|
|
lda #$a54f
|
|
sta h3+2
|
|
lda #$527f
|
|
sta h4
|
|
lda #$510e
|
|
sta h4+2
|
|
lda #$688c
|
|
sta h5
|
|
lda #$9b05
|
|
sta h5+2
|
|
lda #$d9ab
|
|
sta h6
|
|
lda #$1f83
|
|
sta h6+2
|
|
lda #$cd19
|
|
sta h7
|
|
lda #$5be0
|
|
sta h7+2
|
|
|
|
stz length
|
|
stz length+2
|
|
stz length+4
|
|
stz length+6
|
|
stz extra
|
|
rtl
|
|
end
|
|
|
|
|
|
* Process one 64-byte block through the SHA-256 hashing function.
|
|
* This is a low-level function; users should normally not call this directly.
|
|
sha256_processblock start
|
|
CFunction SHA256_PROCESSBLOCK
|
|
end
|
|
|
|
SHA256_PROCESSBLOCK start
|
|
lda h0
|
|
sta a_
|
|
lda h0+2
|
|
sta a_+2
|
|
|
|
lda h1
|
|
sta b
|
|
lda h1+2
|
|
sta b+2
|
|
|
|
lda h2
|
|
sta c
|
|
lda h2+2
|
|
sta c+2
|
|
|
|
lda h3
|
|
sta d
|
|
lda h3+2
|
|
sta d+2
|
|
|
|
lda h4
|
|
sta e
|
|
lda h4+2
|
|
sta e+2
|
|
|
|
lda h5
|
|
sta f
|
|
lda h5+2
|
|
sta f+2
|
|
|
|
lda h6
|
|
sta g
|
|
lda h6+2
|
|
sta g+2
|
|
|
|
lda h6
|
|
sta g
|
|
lda h6+2
|
|
sta g+2
|
|
|
|
lda h7
|
|
sta h
|
|
lda h7+2
|
|
sta h+2
|
|
|
|
lda #k
|
|
sta k_ptr
|
|
ComputeSchedule 1
|
|
jsr BlockLoopSub
|
|
jsr ScheduleAndBlockLoopSub
|
|
jsr ScheduleAndBlockLoopSub
|
|
jsr ScheduleAndBlockLoopSub
|
|
|
|
endloop clc
|
|
lda h0
|
|
adc a_
|
|
sta h0
|
|
lda h0+2
|
|
adc a_+2
|
|
sta h0+2
|
|
|
|
clc
|
|
lda h1
|
|
adc b
|
|
sta h1
|
|
lda h1+2
|
|
adc b+2
|
|
sta h1+2
|
|
|
|
clc
|
|
lda h2
|
|
adc c
|
|
sta h2
|
|
lda h2+2
|
|
adc c+2
|
|
sta h2+2
|
|
|
|
clc
|
|
lda h3
|
|
adc d
|
|
sta h3
|
|
lda h3+2
|
|
adc d+2
|
|
sta h3+2
|
|
|
|
clc
|
|
lda h4
|
|
adc e
|
|
sta h4
|
|
lda h4+2
|
|
adc e+2
|
|
sta h4+2
|
|
|
|
clc
|
|
lda h5
|
|
adc f
|
|
sta h5
|
|
lda h5+2
|
|
adc f+2
|
|
sta h5+2
|
|
|
|
clc
|
|
lda h6
|
|
adc g
|
|
sta h6
|
|
lda h6+2
|
|
adc g+2
|
|
sta h6+2
|
|
|
|
clc
|
|
lda h7
|
|
adc h
|
|
sta h7
|
|
lda h7+2
|
|
adc h+2
|
|
sta h7+2
|
|
rtl
|
|
|
|
ScheduleAndBlockLoopSub anop
|
|
ComputeSchedule 2
|
|
BlockLoopSub anop
|
|
BlockLoopPart 1
|
|
rts
|
|
end
|