Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

crypto: testmgr - Add support for the pcomp interface

Signed-off-by: Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Geert Uytterhoeven and committed by
Herbert Xu
8064efb8 a1d2f095

+193
+183
crypto/testmgr.c
··· 72 72 } comp, decomp; 73 73 }; 74 74 75 + struct pcomp_test_suite { 76 + struct { 77 + struct pcomp_testvec *vecs; 78 + unsigned int count; 79 + } comp, decomp; 80 + }; 81 + 75 82 struct hash_test_suite { 76 83 struct hash_testvec *vecs; 77 84 unsigned int count; ··· 93 86 struct aead_test_suite aead; 94 87 struct cipher_test_suite cipher; 95 88 struct comp_test_suite comp; 89 + struct pcomp_test_suite pcomp; 96 90 struct hash_test_suite hash; 97 91 } suite; 98 92 }; ··· 906 898 return ret; 907 899 } 908 900 901 + static int test_pcomp(struct crypto_pcomp *tfm, 902 + struct pcomp_testvec *ctemplate, 903 + struct pcomp_testvec *dtemplate, int ctcount, 904 + int dtcount) 905 + { 906 + const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm)); 907 + unsigned int i; 908 + char result[COMP_BUF_SIZE]; 909 + int error; 910 + 911 + for (i = 0; i < ctcount; i++) { 912 + struct comp_request req; 913 + 914 + error = crypto_compress_setup(tfm, ctemplate[i].params, 915 + ctemplate[i].paramsize); 916 + if (error) { 917 + pr_err("alg: pcomp: compression setup failed on test " 918 + "%d for %s: error=%d\n", i + 1, algo, error); 919 + return error; 920 + } 921 + 922 + error = crypto_compress_init(tfm); 923 + if (error) { 924 + pr_err("alg: pcomp: compression init failed on test " 925 + "%d for %s: error=%d\n", i + 1, algo, error); 926 + return error; 927 + } 928 + 929 + memset(result, 0, sizeof(result)); 930 + 931 + req.next_in = ctemplate[i].input; 932 + req.avail_in = ctemplate[i].inlen / 2; 933 + req.next_out = result; 934 + req.avail_out = ctemplate[i].outlen / 2; 935 + 936 + error = crypto_compress_update(tfm, &req); 937 + if (error && (error != -EAGAIN || req.avail_in)) { 938 + pr_err("alg: pcomp: compression update failed on test " 939 + "%d for %s: error=%d\n", i + 1, algo, error); 940 + return error; 941 + } 942 + 943 + /* Add remaining input data */ 944 + req.avail_in += (ctemplate[i].inlen + 1) / 2; 945 + 946 + error = crypto_compress_update(tfm, &req); 947 + if (error && (error != -EAGAIN || req.avail_in)) { 948 + pr_err("alg: pcomp: compression update failed on test " 949 + "%d for %s: error=%d\n", i + 1, algo, error); 950 + return error; 951 + } 952 + 953 + /* Provide remaining output space */ 954 + req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2; 955 + 956 + error = crypto_compress_final(tfm, &req); 957 + if (error) { 958 + pr_err("alg: pcomp: compression final failed on test " 959 + "%d for %s: error=%d\n", i + 1, algo, error); 960 + return error; 961 + } 962 + 963 + if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) { 964 + pr_err("alg: comp: Compression test %d failed for %s: " 965 + "output len = %d (expected %d)\n", i + 1, algo, 966 + COMP_BUF_SIZE - req.avail_out, 967 + ctemplate[i].outlen); 968 + return -EINVAL; 969 + } 970 + 971 + if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) { 972 + pr_err("alg: pcomp: Compression test %d failed for " 973 + "%s\n", i + 1, algo); 974 + hexdump(result, ctemplate[i].outlen); 975 + return -EINVAL; 976 + } 977 + } 978 + 979 + for (i = 0; i < dtcount; i++) { 980 + struct comp_request req; 981 + 982 + error = crypto_decompress_setup(tfm, dtemplate[i].params, 983 + dtemplate[i].paramsize); 984 + if (error) { 985 + pr_err("alg: pcomp: decompression setup failed on " 986 + "test %d for %s: error=%d\n", i + 1, algo, 987 + error); 988 + return error; 989 + } 990 + 991 + error = crypto_decompress_init(tfm); 992 + if (error) { 993 + pr_err("alg: pcomp: decompression init failed on test " 994 + "%d for %s: error=%d\n", i + 1, algo, error); 995 + return error; 996 + } 997 + 998 + memset(result, 0, sizeof(result)); 999 + 1000 + req.next_in = dtemplate[i].input; 1001 + req.avail_in = dtemplate[i].inlen / 2; 1002 + req.next_out = result; 1003 + req.avail_out = dtemplate[i].outlen / 2; 1004 + 1005 + error = crypto_decompress_update(tfm, &req); 1006 + if (error && (error != -EAGAIN || req.avail_in)) { 1007 + pr_err("alg: pcomp: decompression update failed on " 1008 + "test %d for %s: error=%d\n", i + 1, algo, 1009 + error); 1010 + return error; 1011 + } 1012 + 1013 + /* Add remaining input data */ 1014 + req.avail_in += (dtemplate[i].inlen + 1) / 2; 1015 + 1016 + error = crypto_decompress_update(tfm, &req); 1017 + if (error && (error != -EAGAIN || req.avail_in)) { 1018 + pr_err("alg: pcomp: decompression update failed on " 1019 + "test %d for %s: error=%d\n", i + 1, algo, 1020 + error); 1021 + return error; 1022 + } 1023 + 1024 + /* Provide remaining output space */ 1025 + req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2; 1026 + 1027 + error = crypto_decompress_final(tfm, &req); 1028 + if (error && (error != -EAGAIN || req.avail_in)) { 1029 + pr_err("alg: pcomp: decompression final failed on " 1030 + "test %d for %s: error=%d\n", i + 1, algo, 1031 + error); 1032 + return error; 1033 + } 1034 + 1035 + if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) { 1036 + pr_err("alg: comp: Decompression test %d failed for " 1037 + "%s: output len = %d (expected %d)\n", i + 1, 1038 + algo, COMP_BUF_SIZE - req.avail_out, 1039 + dtemplate[i].outlen); 1040 + return -EINVAL; 1041 + } 1042 + 1043 + if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) { 1044 + pr_err("alg: pcomp: Decompression test %d failed for " 1045 + "%s\n", i + 1, algo); 1046 + hexdump(result, dtemplate[i].outlen); 1047 + return -EINVAL; 1048 + } 1049 + } 1050 + 1051 + return 0; 1052 + } 1053 + 909 1054 static int alg_test_aead(const struct alg_test_desc *desc, const char *driver, 910 1055 u32 type, u32 mask) 911 1056 { ··· 1165 1004 desc->suite.comp.decomp.count); 1166 1005 1167 1006 crypto_free_comp(tfm); 1007 + return err; 1008 + } 1009 + 1010 + static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver, 1011 + u32 type, u32 mask) 1012 + { 1013 + struct crypto_pcomp *tfm; 1014 + int err; 1015 + 1016 + tfm = crypto_alloc_pcomp(driver, type, mask); 1017 + if (IS_ERR(tfm)) { 1018 + pr_err("alg: pcomp: Failed to load transform for %s: %ld\n", 1019 + driver, PTR_ERR(tfm)); 1020 + return PTR_ERR(tfm); 1021 + } 1022 + 1023 + err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs, 1024 + desc->suite.pcomp.decomp.vecs, 1025 + desc->suite.pcomp.comp.count, 1026 + desc->suite.pcomp.decomp.count); 1027 + 1028 + crypto_free_pcomp(tfm); 1168 1029 return err; 1169 1030 } 1170 1031
+10
crypto/testmgr.h
··· 15 15 #ifndef _CRYPTO_TESTMGR_H 16 16 #define _CRYPTO_TESTMGR_H 17 17 18 + #include <crypto/compress.h> 19 + 18 20 #define MAX_DIGEST_SIZE 64 19 21 #define MAX_TAP 8 20 22 ··· 8344 8342 #define COMP_BUF_SIZE 512 8345 8343 8346 8344 struct comp_testvec { 8345 + int inlen, outlen; 8346 + char input[COMP_BUF_SIZE]; 8347 + char output[COMP_BUF_SIZE]; 8348 + }; 8349 + 8350 + struct pcomp_testvec { 8351 + void *params; 8352 + unsigned int paramsize; 8347 8353 int inlen, outlen; 8348 8354 char input[COMP_BUF_SIZE]; 8349 8355 char output[COMP_BUF_SIZE];