56 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			V
		
	
	
| // The source code refers to the go standard library, which will be combined with AES in the future.
 | |
| 
 | |
| module cipher
 | |
| 
 | |
| // A Block represents an implementation of block cipher
 | |
| // using a given key. It provides the capability to encrypt
 | |
| // or decrypt individual blocks. The mode implementations
 | |
| // extend that capability to streams of blocks.
 | |
| interface Block {
 | |
| 	block_size int // block_size returns the cipher's block size.
 | |
| 	encrypt(mut dst []byte, src []byte) // Encrypt encrypts the first block in src into dst.
 | |
| 	// Dst and src must overlap entirely or not at all.
 | |
| 	decrypt(mut dst []byte, src []byte) // Decrypt decrypts the first block in src into dst.
 | |
| 	// Dst and src must overlap entirely or not at all.
 | |
| }
 | |
| 
 | |
| // A Stream represents a stream cipher.
 | |
| interface Stream {
 | |
| 	// xor_key_stream XORs each byte in the given slice with a byte from the
 | |
| 	// cipher's key stream. Dst and src must overlap entirely or not at all.
 | |
| 	//
 | |
| 	// If len(dst) < len(src), xor_key_stream should panic. It is acceptable
 | |
| 	// to pass a dst bigger than src, and in that case, xor_key_stream will
 | |
| 	// only update dst[:len(src)] and will not touch the rest of dst.
 | |
| 	//
 | |
| 	// Multiple calls to xor_key_stream behave as if the concatenation of
 | |
| 	// the src buffers was passed in a single run. That is, Stream
 | |
| 	// maintains state and does not reset at each xor_key_stream call.
 | |
| 	xor_key_stream(mut dst []byte, src []byte)
 | |
| }
 | |
| 
 | |
| // A BlockMode represents a block cipher running in a block-based mode (CBC,
 | |
| // ECB etc).
 | |
| interface BlockMode {
 | |
| 	block_size int // block_size returns the mode's block size.
 | |
| 	crypt_blocks(mut dst []byte, src []byte) // crypt_blocks encrypts or decrypts a number of blocks. The length of
 | |
| 	// src must be a multiple of the block size. Dst and src must overlap
 | |
| 	// entirely or not at all.
 | |
| 	//
 | |
| 	// If len(dst) < len(src), crypt_blocks should panic. It is acceptable
 | |
| 	// to pass a dst bigger than src, and in that case, crypt_blocks will
 | |
| 	// only update dst[:len(src)] and will not touch the rest of dst.
 | |
| 	//
 | |
| 	// Multiple calls to crypt_blocks behave as if the concatenation of
 | |
| 	// the src buffers was passed in a single run. That is, BlockMode
 | |
| 	// maintains state and does not reset at each crypt_blocks call.
 | |
| }
 | |
| 
 | |
| // Utility routines
 | |
| 
 | |
| // fn dup(p []byte) []byte {
 | |
| // 	q := make([]byte, p.len)
 | |
| // 	copy(q, p)
 | |
| // 	return q
 | |
| // }
 |