1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * This file is part of FFmpeg. 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 5cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 6cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 7cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 10cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 11cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12cabdff1aSopenharmony_ci * Lesser General Public License for more details. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 15cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 16cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17cabdff1aSopenharmony_ci */ 18cabdff1aSopenharmony_ci 19cabdff1aSopenharmony_ci#include "libavutil/hmac.c" 20cabdff1aSopenharmony_ci 21cabdff1aSopenharmony_ci#include <stdio.h> 22cabdff1aSopenharmony_ci#include <string.h> 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_cistatic void test(AVHMAC *hmac, const uint8_t *key, int keylen, 25cabdff1aSopenharmony_ci const uint8_t *data, int datalen) 26cabdff1aSopenharmony_ci{ 27cabdff1aSopenharmony_ci uint8_t buf[MAX_HASHLEN]; 28cabdff1aSopenharmony_ci int out, i; 29cabdff1aSopenharmony_ci // Some of the test vectors are strings, where sizeof() includes the 30cabdff1aSopenharmony_ci // trailing null byte - remove that. 31cabdff1aSopenharmony_ci if (!key[keylen - 1]) 32cabdff1aSopenharmony_ci keylen--; 33cabdff1aSopenharmony_ci if (!data[datalen - 1]) 34cabdff1aSopenharmony_ci datalen--; 35cabdff1aSopenharmony_ci out = av_hmac_calc(hmac, data, datalen, key, keylen, buf, sizeof(buf)); 36cabdff1aSopenharmony_ci for (i = 0; i < out; i++) 37cabdff1aSopenharmony_ci printf("%02x", buf[i]); 38cabdff1aSopenharmony_ci printf("\n"); 39cabdff1aSopenharmony_ci} 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_ciint main(void) 42cabdff1aSopenharmony_ci{ 43cabdff1aSopenharmony_ci uint8_t key1[20], key3[131], data3[50]; 44cabdff1aSopenharmony_ci AVHMAC *hmac; 45cabdff1aSopenharmony_ci enum AVHMACType i; 46cabdff1aSopenharmony_ci static const uint8_t key2[] = "Jefe"; 47cabdff1aSopenharmony_ci static const uint8_t data1[] = "Hi There"; 48cabdff1aSopenharmony_ci static const uint8_t data2[] = "what do ya want for nothing?"; 49cabdff1aSopenharmony_ci static const uint8_t data4[] = "Test Using Larger Than Block-Size Key - Hash Key First"; 50cabdff1aSopenharmony_ci static const uint8_t data5[] = "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data"; 51cabdff1aSopenharmony_ci static const uint8_t data6[] = "This is a test using a larger than block-size key and a larger " 52cabdff1aSopenharmony_ci "than block-size data. The key needs to be hashed before being used" 53cabdff1aSopenharmony_ci " by the HMAC algorithm."; 54cabdff1aSopenharmony_ci memset(key1, 0x0b, sizeof(key1)); 55cabdff1aSopenharmony_ci memset(key3, 0xaa, sizeof(key3)); 56cabdff1aSopenharmony_ci memset(data3, 0xdd, sizeof(data3)); 57cabdff1aSopenharmony_ci 58cabdff1aSopenharmony_ci /* MD5, SHA-1 */ 59cabdff1aSopenharmony_ci for (i = AV_HMAC_MD5; i <= AV_HMAC_SHA1; i++) { 60cabdff1aSopenharmony_ci hmac = av_hmac_alloc(i); 61cabdff1aSopenharmony_ci if (!hmac) 62cabdff1aSopenharmony_ci return 1; 63cabdff1aSopenharmony_ci // RFC 2202 test vectors 64cabdff1aSopenharmony_ci test(hmac, key1, hmac->hashlen, data1, sizeof(data1)); 65cabdff1aSopenharmony_ci test(hmac, key2, sizeof(key2), data2, sizeof(data2)); 66cabdff1aSopenharmony_ci test(hmac, key3, hmac->hashlen, data3, sizeof(data3)); 67cabdff1aSopenharmony_ci test(hmac, key3, 80, data4, sizeof(data4)); 68cabdff1aSopenharmony_ci test(hmac, key3, 80, data5, sizeof(data5)); 69cabdff1aSopenharmony_ci av_hmac_free(hmac); 70cabdff1aSopenharmony_ci } 71cabdff1aSopenharmony_ci 72cabdff1aSopenharmony_ci /* SHA-2 */ 73cabdff1aSopenharmony_ci for (i = AV_HMAC_SHA224; i <= AV_HMAC_SHA512; i++) { 74cabdff1aSopenharmony_ci hmac = av_hmac_alloc(i); 75cabdff1aSopenharmony_ci if (!hmac) 76cabdff1aSopenharmony_ci return 1; 77cabdff1aSopenharmony_ci // RFC 4231 test vectors 78cabdff1aSopenharmony_ci test(hmac, key1, sizeof(key1), data1, sizeof(data1)); 79cabdff1aSopenharmony_ci test(hmac, key2, sizeof(key2), data2, sizeof(data2)); 80cabdff1aSopenharmony_ci test(hmac, key3, 20, data3, sizeof(data3)); 81cabdff1aSopenharmony_ci test(hmac, key3, sizeof(key3), data4, sizeof(data4)); 82cabdff1aSopenharmony_ci test(hmac, key3, sizeof(key3), data6, sizeof(data6)); 83cabdff1aSopenharmony_ci av_hmac_free(hmac); 84cabdff1aSopenharmony_ci } 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_ci return 0; 87cabdff1aSopenharmony_ci} 88