The Go Programming Language

Source file src/pkg/crypto/xtea/block.go

     1	// Copyright 2009 The Go Authors. All rights reserved.
     2	// Use of this source code is governed by a BSD-style
     3	// license that can be found in the LICENSE file.
     4	
     5	/*
     6		Implementation adapted from Needham and Wheeler's paper:
     7		http://www.cix.co.uk/~klockstone/xtea.pdf
     8	
     9		A precalculated look up table is used during encryption/decryption for values that are based purely on the key.
    10	*/
    11	
    12	package xtea
    13	
    14	// XTEA is based on 64 rounds.
    15	const numRounds = 64
    16	
    17	// blockToUint32 reads an 8 byte slice into two uint32s.
    18	// The block is treated as big endian.
    19	func blockToUint32(src []byte) (uint32, uint32) {
    20		r0 := uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3])
    21		r1 := uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7])
    22		return r0, r1
    23	}
    24	
    25	// uint32ToBlock writes two uint32s into an 8 byte data block.
    26	// Values are written as big endian.
    27	func uint32ToBlock(v0, v1 uint32, dst []byte) {
    28		dst[0] = byte(v0 >> 24)
    29		dst[1] = byte(v0 >> 16)
    30		dst[2] = byte(v0 >> 8)
    31		dst[3] = byte(v0)
    32		dst[4] = byte(v1 >> 24)
    33		dst[5] = byte(v1 >> 16)
    34		dst[6] = byte(v1 >> 8)
    35		dst[7] = byte(v1 >> 0)
    36	}
    37	
    38	// encryptBlock encrypts a single 8 byte block using XTEA.
    39	func encryptBlock(c *Cipher, dst, src []byte) {
    40		v0, v1 := blockToUint32(src)
    41	
    42		// Two rounds of XTEA applied per loop
    43		for i := 0; i < numRounds; {
    44			v0 += ((v1<<4 ^ v1>>5) + v1) ^ c.table[i]
    45			i++
    46			v1 += ((v0<<4 ^ v0>>5) + v0) ^ c.table[i]
    47			i++
    48		}
    49	
    50		uint32ToBlock(v0, v1, dst)
    51	}
    52	
    53	// decryptBlock decrypt a single 8 byte block using XTEA.
    54	func decryptBlock(c *Cipher, dst, src []byte) {
    55		v0, v1 := blockToUint32(src)
    56	
    57		// Two rounds of XTEA applied per loop
    58		for i := numRounds; i > 0; {
    59			i--
    60			v1 -= ((v0<<4 ^ v0>>5) + v0) ^ c.table[i]
    61			i--
    62			v0 -= ((v1<<4 ^ v1>>5) + v1) ^ c.table[i]
    63		}
    64	
    65		uint32ToBlock(v0, v1, dst)
    66	}

release.r60.3. Except as noted, this content is licensed under a Creative Commons Attribution 3.0 License.