1/* 2 * A 32-bit implementation of the TEA algorithm 3 * Copyright (c) 2015 Vesselin Bontchev 4 * 5 * Loosely based on the implementation of David Wheeler and Roger Needham, 6 * https://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm#Reference_code 7 * 8 * This file is part of FFmpeg. 9 * 10 * FFmpeg is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU Lesser General Public 12 * License as published by the Free Software Foundation; either 13 * version 2.1 of the License, or (at your option) any later version. 14 * 15 * FFmpeg is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 * Lesser General Public License for more details. 19 * 20 * You should have received a copy of the GNU Lesser General Public 21 * License along with FFmpeg; if not, write to the Free Software 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 23 */ 24 25#include <stdio.h> 26 27#include "libavutil/common.h" 28#include "libavutil/tea.h" 29 30#define TEA_NUM_TESTS 4 31 32// https://github.com/logandrews/TeaCrypt/blob/master/tea/tea_test.go 33static const uint8_t tea_test_key[TEA_NUM_TESTS][16] = { 34 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 35 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 36 }, 37 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 38 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 39 }, 40 { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 41 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF 42 }, 43 { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 44 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF 45 } 46}; 47 48static const uint8_t tea_test_pt[TEA_NUM_TESTS][8] = { 49 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 50 { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }, 51 { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }, 52 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF } 53}; 54 55static const uint8_t tea_test_ct[TEA_NUM_TESTS][8] = { 56 { 0x41, 0xEA, 0x3A, 0x0A, 0x94, 0xBA, 0xA9, 0x40 }, 57 { 0x6A, 0x2F, 0x9C, 0xF3, 0xFC, 0xCF, 0x3C, 0x55 }, 58 { 0xDE, 0xB1, 0xC0, 0xA2, 0x7E, 0x74, 0x5D, 0xB3 }, 59 { 0x12, 0x6C, 0x6B, 0x92, 0xC0, 0x65, 0x3A, 0x3E } 60}; 61 62static void test_tea(struct AVTEA *ctx, uint8_t *dst, const uint8_t *src, 63 const uint8_t *ref, int len, uint8_t *iv, int dir, 64 const char *test) 65{ 66 av_tea_crypt(ctx, dst, src, len, iv, dir); 67 if (memcmp(dst, ref, 8*len)) { 68 int i; 69 printf("%s failed\ngot ", test); 70 for (i = 0; i < 8*len; i++) 71 printf("%02x ", dst[i]); 72 printf("\nexpected "); 73 for (i = 0; i < 8*len; i++) 74 printf("%02x ", ref[i]); 75 printf("\n"); 76 exit(1); 77 } 78} 79 80int main(void) 81{ 82 struct AVTEA *ctx; 83 uint8_t buf[8], iv[8]; 84 int i; 85 static const uint8_t src[32] = "HelloWorldHelloWorldHelloWorld"; 86 uint8_t ct[32]; 87 uint8_t pl[32]; 88 89 ctx = av_tea_alloc(); 90 if (!ctx) 91 return 1; 92 93 for (i = 0; i < TEA_NUM_TESTS; i++) { 94 av_tea_init(ctx, tea_test_key[i], 64); 95 96 test_tea(ctx, buf, tea_test_pt[i], tea_test_ct[i], 1, NULL, 0, "encryption"); 97 test_tea(ctx, buf, tea_test_ct[i], tea_test_pt[i], 1, NULL, 1, "decryption"); 98 99 /* encrypt */ 100 memcpy(iv, "HALLO123", 8); 101 av_tea_crypt(ctx, ct, src, 4, iv, 0); 102 103 /* decrypt into pl */ 104 memcpy(iv, "HALLO123", 8); 105 test_tea(ctx, pl, ct, src, 4, iv, 1, "CBC decryption"); 106 107 memcpy(iv, "HALLO123", 8); 108 test_tea(ctx, ct, ct, src, 4, iv, 1, "CBC inplace decryption"); 109 } 110 111 printf("Test encryption/decryption success.\n"); 112 av_free(ctx); 113 114 return 0; 115} 116