curve448utils.h 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*
  2. * Copyright 2017-2019 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 OSSL_CRYPTO_EC_CURVE448UTILS_H
  13. # define OSSL_CRYPTO_EC_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. && (!defined(__SIZEOF_LONG__) || (__SIZEOF_LONG__ == 8))
  26. # define C448_WORD_BITS 64 /* The number of bits in a word */
  27. # else
  28. # define C448_WORD_BITS 32 /* The number of bits in a word */
  29. # endif
  30. # endif
  31. # if C448_WORD_BITS == 64
  32. /* Word size for internal computations */
  33. typedef uint64_t c448_word_t;
  34. /* Signed word size for internal computations */
  35. typedef int64_t c448_sword_t;
  36. /* "Boolean" type, will be set to all-zero or all-one (i.e. -1u) */
  37. typedef uint64_t c448_bool_t;
  38. /* Double-word size for internal computations */
  39. typedef __uint128_t c448_dword_t;
  40. /* Signed double-word size for internal computations */
  41. typedef __int128_t c448_dsword_t;
  42. # elif C448_WORD_BITS == 32
  43. /* Word size for internal computations */
  44. typedef uint32_t c448_word_t;
  45. /* Signed word size for internal computations */
  46. typedef int32_t c448_sword_t;
  47. /* "Boolean" type, will be set to all-zero or all-one (i.e. -1u) */
  48. typedef uint32_t c448_bool_t;
  49. /* Double-word size for internal computations */
  50. typedef uint64_t c448_dword_t;
  51. /* Signed double-word size for internal computations */
  52. typedef int64_t c448_dsword_t;
  53. # else
  54. # error "Only supporting C448_WORD_BITS = 32 or 64 for now"
  55. # endif
  56. /* C448_TRUE = -1 so that C448_TRUE & x = x */
  57. # define C448_TRUE (0 - (c448_bool_t)1)
  58. /* C448_FALSE = 0 so that C448_FALSE & x = 0 */
  59. # define C448_FALSE 0
  60. /* Another boolean type used to indicate success or failure. */
  61. typedef enum {
  62. C448_SUCCESS = -1, /**< The operation succeeded. */
  63. C448_FAILURE = 0 /**< The operation failed. */
  64. } c448_error_t;
  65. /* Return success if x is true */
  66. static ossl_inline c448_error_t c448_succeed_if(c448_bool_t x)
  67. {
  68. return (c448_error_t) x;
  69. }
  70. #endif /* __C448_COMMON_H__ */