curve448utils.h 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /*
  2. * Copyright 2017-2021 The OpenSSL Project Authors. All Rights Reserved.
  3. * Copyright 2015 Cryptography Research, Inc.
  4. *
  5. * Licensed under the Apache License 2.0 (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. # include "internal/numbers.h"
  16. /*
  17. * Internal word types. Somewhat tricky. This could be decided separately per
  18. * platform. However, the structs do need to be all the same size and
  19. * alignment on a given platform to support dynamic linking, since even if you
  20. * header was built with eg arch_neon, you might end up linking a library built
  21. * with arch_arm32.
  22. */
  23. # ifndef C448_WORD_BITS
  24. # if (defined(__SIZEOF_INT128__) && (__SIZEOF_INT128__ == 16)) \
  25. && !defined(__sparc__) \
  26. && (!defined(__SIZEOF_LONG__) || (__SIZEOF_LONG__ == 8))
  27. # define C448_WORD_BITS 64 /* The number of bits in a word */
  28. # else
  29. # define C448_WORD_BITS 32 /* The number of bits in a word */
  30. # endif
  31. # endif
  32. # if C448_WORD_BITS == 64
  33. /* Word size for internal computations */
  34. typedef uint64_t c448_word_t;
  35. /* Signed word size for internal computations */
  36. typedef int64_t c448_sword_t;
  37. /* "Boolean" type, will be set to all-zero or all-one (i.e. -1u) */
  38. typedef uint64_t c448_bool_t;
  39. /* Double-word size for internal computations */
  40. typedef uint128_t c448_dword_t;
  41. /* Signed double-word size for internal computations */
  42. typedef int128_t c448_dsword_t;
  43. # elif C448_WORD_BITS == 32
  44. /* Word size for internal computations */
  45. typedef uint32_t c448_word_t;
  46. /* Signed word size for internal computations */
  47. typedef int32_t c448_sword_t;
  48. /* "Boolean" type, will be set to all-zero or all-one (i.e. -1u) */
  49. typedef uint32_t c448_bool_t;
  50. /* Double-word size for internal computations */
  51. typedef uint64_t c448_dword_t;
  52. /* Signed double-word size for internal computations */
  53. typedef int64_t c448_dsword_t;
  54. # else
  55. # error "Only supporting C448_WORD_BITS = 32 or 64 for now"
  56. # endif
  57. /* C448_TRUE = -1 so that C448_TRUE & x = x */
  58. # define C448_TRUE (0 - (c448_bool_t)1)
  59. /* C448_FALSE = 0 so that C448_FALSE & x = 0 */
  60. # define C448_FALSE 0
  61. /* Another boolean type used to indicate success or failure. */
  62. typedef enum {
  63. C448_SUCCESS = -1, /**< The operation succeeded. */
  64. C448_FAILURE = 0 /**< The operation failed. */
  65. } c448_error_t;
  66. /* Return success if x is true */
  67. static ossl_inline c448_error_t c448_succeed_if(c448_bool_t x)
  68. {
  69. return (c448_error_t) x;
  70. }
  71. #endif /* __C448_COMMON_H__ */