test_suite_common.function 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /* BEGIN_HEADER */
  2. #include "../library/common.h"
  3. void fill_arrays(unsigned char *a, unsigned char *b, unsigned char *r1, unsigned char *r2, size_t n)
  4. {
  5. for (size_t i = 0; i < n; i++) {
  6. a[i] = (unsigned char) i * 3;
  7. b[i] = (unsigned char) i * 3 + 1;
  8. r1[i] = (unsigned char) i * 3 + 2;
  9. r2[i] = r1[i];
  10. }
  11. }
  12. /* END_HEADER */
  13. /* BEGIN_CASE */
  14. void mbedtls_xor(int len)
  15. {
  16. size_t n = (size_t) len;
  17. unsigned char *a = NULL, *b = NULL, *r1 = NULL, *r2 = NULL;
  18. ASSERT_ALLOC(a, n + 1);
  19. ASSERT_ALLOC(b, n + 1);
  20. ASSERT_ALLOC(r1, n + 1);
  21. ASSERT_ALLOC(r2, n + 1);
  22. /* Test non-overlapping */
  23. fill_arrays(a, b, r1, r2, n);
  24. for (size_t i = 0; i < n; i++) {
  25. r1[i] = a[i] ^ b[i];
  26. }
  27. mbedtls_xor(r2, a, b, n);
  28. ASSERT_COMPARE(r1, n, r2, n);
  29. /* Test r == a */
  30. fill_arrays(a, b, r1, r2, n);
  31. for (size_t i = 0; i < n; i++) {
  32. r1[i] = r1[i] ^ b[i];
  33. }
  34. mbedtls_xor(r2, r2, b, n);
  35. ASSERT_COMPARE(r1, n, r2, n);
  36. /* Test r == b */
  37. fill_arrays(a, b, r1, r2, n);
  38. for (size_t i = 0; i < n; i++) {
  39. r1[i] = a[i] ^ r1[i];
  40. }
  41. mbedtls_xor(r2, a, r2, n);
  42. ASSERT_COMPARE(r1, n, r2, n);
  43. /* Test a == b */
  44. fill_arrays(a, b, r1, r2, n);
  45. for (size_t i = 0; i < n; i++) {
  46. r1[i] = a[i] ^ a[i];
  47. }
  48. mbedtls_xor(r2, a, a, n);
  49. ASSERT_COMPARE(r1, n, r2, n);
  50. /* Test a == b == r */
  51. fill_arrays(a, b, r1, r2, n);
  52. for (size_t i = 0; i < n; i++) {
  53. r1[i] = r1[i] ^ r1[i];
  54. }
  55. mbedtls_xor(r2, r2, r2, n);
  56. ASSERT_COMPARE(r1, n, r2, n);
  57. /* Test non-word-aligned buffers, for all combinations of alignedness */
  58. for (int i = 0; i < 7; i++) {
  59. int r_off = i & 1, a_off = (i & 2) >> 1, b_off = (i & 4) >> 2;
  60. fill_arrays(a, b, r1, r2, n + 1);
  61. for (size_t j = 0; j < n; j++) {
  62. r1[j + r_off] = a[j + a_off] ^ b[j + b_off];
  63. }
  64. mbedtls_xor(r2 + r_off, a + a_off, b + b_off, n);
  65. ASSERT_COMPARE(r1 + r_off, n, r2 + r_off, n);
  66. }
  67. exit:
  68. mbedtls_free(a);
  69. mbedtls_free(b);
  70. mbedtls_free(r1);
  71. mbedtls_free(r2);
  72. }
  73. /* END_CASE */