65816-crypto/sha256.asm

361 lines
5.4 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
zero gequ 10
a_ gequ 12 ; elements of state
zero2 gequ 16
b gequ 18
zero3 gequ 22
c gequ 24
zero4 gequ 28
d gequ 30
zero5 gequ 34
e gequ 36
zero6 gequ 40
f gequ 42
zero7 gequ 46
g gequ 48
zero8 gequ 52
h gequ 54
zero9 gequ 58
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
ch gequ 156
maj gequ 160
k_ptr gequ 164
idx gequ 168
two gequ 170
four gequ 172
six gequ 174
eight gequ 176
ten gequ 178
twelve gequ 180
fourteen gequ 182
sixteen gequ 184
eighteen gequ 186
twenty gequ 188
twentytwo gequ 190
twentyfour gequ 192
twentysix gequ 194
twentyeight gequ 196
thirty gequ 198
temp1 gequ 200
temp2 gequ 204
temp3 gequ 208
temp4 gequ 212
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 context for SHA-256 computation.
* An init function must be called before any of the other SHA-256 functions.
sha256_init start
CFunction SHA256_INIT
end
* Initialize a context for SHA-224 computation.
* To compute a SHA-224 hash, call this function, and then call the below
* functions as if computing a SHA-256 hash. After calling sha256_finalize,
* the first 28 bytes of context->hash will contain the SHA-224 hash.
sha224_init start
CFunction SHA224_INIT
end
SHA224_INIT start
lda #$9ed8
sta h0
lda #$c105
sta h0+2
lda #$d507
sta h1
lda #$367c
sta h1+2
lda #$dd17
sta h2
lda #$3070
sta h2+2
lda #$5939
sta h3
lda #$f70e
sta h3+2
lda #$0b31
sta h4
lda #$ffc0
sta h4+2
lda #$1511
sta h5
lda #$6858
sta h5+2
lda #$8fa7
sta h6
lda #$64f9
sta h6+2
lda #$4fa4
sta h7
lda #$befa
sta h7+2
bra initdp
SHA256_INIT entry
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
initdp stz length
stz length+2
stz length+4
stz length+6
stz extra
stz zero
stz zero2
stz zero3
stz zero4
stz zero5
stz zero6
stz zero7
stz zero8
stz zero9
lda #2
sta two
lda #4
sta four
lda #6
sta six
lda #8
sta eight
lda #10
sta ten
lda #12
sta twelve
lda #14
sta fourteen
lda #16
sta sixteen
lda #18
sta eighteen
lda #20
sta twenty
lda #22
sta twentytwo
lda #24
sta twentyfour
lda #26
sta twentysix
lda #28
sta twentyeight
lda #30
sta thirty
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