curve448utils.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /*
  2. * Copyright 2017-2018 The OpenSSL Project Authors. All Rights Reserved.
  3. * Copyright 2015 Cryptography Research, Inc.
  4. *
  5. * Licensed under the OpenSSL license (the "License"). You may not use
  6. * this file except in compliance with the License. You can obtain a copy
  7. * in the file LICENSE in the source distribution or at
  8. * https://www.openssl.org/source/license.html
  9. *
  10. * Originally written by Mike Hamburg
  11. */
  12. #ifndef HEADER_CURVE448UTILS_H
  13. # define HEADER_CURVE448UTILS_H
  14. # include <openssl/e_os2.h>
  15. /*
  16. * Internal word types. Somewhat tricky. This could be decided separately per
  17. * platform. However, the structs do need to be all the same size and
  18. * alignment on a given platform to support dynamic linking, since even if you
  19. * header was built with eg arch_neon, you might end up linking a library built
  20. * with arch_arm32.
  21. */
  22. # ifndef C448_WORD_BITS
  23. # if (defined(__SIZEOF_INT128__) && (__SIZEOF_INT128__ == 16)) \
  24. && !defined(__sparc__)
  25. # define C448_WORD_BITS 64 /* The number of bits in a word */
  26. # else
  27. # define C448_WORD_BITS 32 /* The number of bits in a word */
  28. # endif
  29. # endif
  30. # if C448_WORD_BITS == 64
  31. /* Word size for internal computations */
  32. typedef uint64_t c448_word_t;
  33. /* Signed word size for internal computations */
  34. typedef int64_t c448_sword_t;
  35. /* "Boolean" type, will be set to all-zero or all-one (i.e. -1u) */
  36. typedef uint64_t c448_bool_t;
  37. /* Double-word size for internal computations */
  38. typedef __uint128_t c448_dword_t;
  39. /* Signed double-word size for internal computations */
  40. typedef __int128_t c448_dsword_t;
  41. # elif C448_WORD_BITS == 32
  42. /* Word size for internal computations */
  43. typedef uint32_t c448_word_t;
  44. /* Signed word size for internal computations */
  45. typedef int32_t c448_sword_t;
  46. /* "Boolean" type, will be set to all-zero or all-one (i.e. -1u) */
  47. typedef uint32_t c448_bool_t;
  48. /* Double-word size for internal computations */
  49. typedef uint64_t c448_dword_t;
  50. /* Signed double-word size for internal computations */
  51. typedef int64_t c448_dsword_t;
  52. # else
  53. # error "Only supporting C448_WORD_BITS = 32 or 64 for now"
  54. # endif
  55. /* C448_TRUE = -1 so that C448_TRUE & x = x */
  56. # define C448_TRUE (0 - (c448_bool_t)1)
  57. /* C448_FALSE = 0 so that C448_FALSE & x = 0 */
  58. # define C448_FALSE 0
  59. /* Another boolean type used to indicate success or failure. */
  60. typedef enum {
  61. C448_SUCCESS = -1, /**< The operation succeeded. */
  62. C448_FAILURE = 0 /**< The operation failed. */
  63. } c448_error_t;
  64. /* Return success if x is true */
  65. static ossl_inline c448_error_t c448_succeed_if(c448_bool_t x)
  66. {
  67. return (c448_error_t) x;
  68. }
  69. #endif /* __C448_COMMON_H__ */