RC2 vector creation

This page documents the code that was used to generate the RC2 CBC test vector. The CBC vector was generated using Go’s internal RC2 implementation and verified using Go and OpenSSL.

Creation/Verification

The program below outputs a test vector in the standard format we use and also verifies that the encrypted value round trips as expected. The output was also checked against OpenSSL by modifying cryptography to support the algorithm. If you wish to run this program we recommend cloning the repository, which also contains the requisite go.mod file.

package main

import (
	"bytes"
	"crypto/cipher"
	"encoding/hex"
	"fmt"
	"rc2sucks/rc2"
)

func main() {
	// Generate
	count := 1
	key := []byte("0000000000000000")
	iv := []byte("00000000")
	plaintext := []byte("the quick brown fox jumped over the lazy dog!!!!")
	ciphertext := make([]byte, len(plaintext))
	block, _ := rc2.New(key, 128)
	mode := cipher.NewCBCEncrypter(block, iv)
	mode.CryptBlocks(ciphertext, plaintext)
	fmt.Printf("COUNT = %v\n", count)
	fmt.Printf("Key = %s\n", hex.EncodeToString(key))
	fmt.Printf("IV = %s\n", hex.EncodeToString(iv))
	fmt.Printf("Plaintext = %s\n", hex.EncodeToString(plaintext))
	fmt.Printf("Ciphertext = %s\n", hex.EncodeToString(ciphertext))
	// Verify
	decrypted := make([]byte, len(plaintext))
	decmode := cipher.NewCBCDecrypter(block, iv)
	decmode.CryptBlocks(decrypted, ciphertext)
	if bytes.Equal(decrypted, plaintext) {
		fmt.Println("Success")
	} else {
		fmt.Println("Failed")
	}
}

Download link: genrc2.go

Download link: rc2.go