Newer
Older
TRUTH_TABLE = trinary.Trits{1, 0, -1, 2, 1, -1, 0, 2, -1, 1, 0}
Initialize()
InitializeCurl(trits *[]int8, length int, rounds int)
Reset()
Absorb(trits *[]int8, offset int, length int)
Squeeze(resp []int8, offset int, length int) []int
}
func NewCurl(hashLength int, rounds int) *Curl {
this := &Curl{
hashLength: hashLength,
rounds: rounds,
}
}
func (curl *Curl) Initialize() {
func (curl *Curl) InitializeCurl(trits trinary.Trits, length int, rounds int) {
if trits != nil {
curl.state = trits
}
func (curl *Curl) Reset() {
func (curl *Curl) Absorb(trits trinary.Trits, offset int, length int) {
for {
limit := int(math.Min(HASH_LENGTH, float64(length)))
copy(curl.state, trits[offset:offset+limit])
curl.Transform()
offset += HASH_LENGTH
length -= HASH_LENGTH
if length <= 0 {
break
}
}
func (curl *Curl) Squeeze(resp trinary.Trits, offset int, length int) trinary.Trits {
for {
limit := int(math.Min(HASH_LENGTH, float64(length)))
copy(resp[offset:offset+limit], curl.state)
curl.Transform()
offset += HASH_LENGTH
length -= HASH_LENGTH
if length <= 0 {
break
}
}
return resp
}
func (curl *Curl) Transform() {
var index = 0
for round := 0; round < curl.rounds; round++ {
copy(stateCopy, curl.state)
for i := 0; i < STATE_LENGTH; i++ {
incr := 364
if index >= 365 {
incr = -365
}
index2 := index + incr
curl.state[i] = TRUTH_TABLE[stateCopy[index]+(stateCopy[index2]<<2)+5]
index = index2
}
}
}