coinex-api 0.0.7__py3-none-any.whl → 0.0.9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- coinex_api-0.0.9.dist-info/METADATA +81 -0
- coinex_api-0.0.9.dist-info/RECORD +3 -0
- coinex_api/__init__.py +0 -7
- coinex_api/ccxt/__init__.py +0 -101
- coinex_api/ccxt/abstract/coinex.py +0 -237
- coinex_api/ccxt/async_support/__init__.py +0 -80
- coinex_api/ccxt/async_support/base/__init__.py +0 -1
- coinex_api/ccxt/async_support/base/exchange.py +0 -2100
- coinex_api/ccxt/async_support/base/throttler.py +0 -50
- coinex_api/ccxt/async_support/base/ws/__init__.py +0 -38
- coinex_api/ccxt/async_support/base/ws/aiohttp_client.py +0 -147
- coinex_api/ccxt/async_support/base/ws/cache.py +0 -213
- coinex_api/ccxt/async_support/base/ws/client.py +0 -214
- coinex_api/ccxt/async_support/base/ws/fast_client.py +0 -97
- coinex_api/ccxt/async_support/base/ws/functions.py +0 -59
- coinex_api/ccxt/async_support/base/ws/future.py +0 -69
- coinex_api/ccxt/async_support/base/ws/order_book.py +0 -78
- coinex_api/ccxt/async_support/base/ws/order_book_side.py +0 -174
- coinex_api/ccxt/async_support/coinex.py +0 -5833
- coinex_api/ccxt/base/__init__.py +0 -27
- coinex_api/ccxt/base/decimal_to_precision.py +0 -174
- coinex_api/ccxt/base/errors.py +0 -267
- coinex_api/ccxt/base/exchange.py +0 -6770
- coinex_api/ccxt/base/precise.py +0 -297
- coinex_api/ccxt/base/types.py +0 -577
- coinex_api/ccxt/coinex.py +0 -5832
- coinex_api/ccxt/pro/__init__.py +0 -21
- coinex_api/ccxt/pro/coinex.py +0 -1366
- coinex_api/ccxt/static_dependencies/README.md +0 -1
- coinex_api/ccxt/static_dependencies/__init__.py +0 -1
- coinex_api/ccxt/static_dependencies/ecdsa/__init__.py +0 -14
- coinex_api/ccxt/static_dependencies/ecdsa/_version.py +0 -520
- coinex_api/ccxt/static_dependencies/ecdsa/curves.py +0 -56
- coinex_api/ccxt/static_dependencies/ecdsa/der.py +0 -221
- coinex_api/ccxt/static_dependencies/ecdsa/ecdsa.py +0 -310
- coinex_api/ccxt/static_dependencies/ecdsa/ellipticcurve.py +0 -197
- coinex_api/ccxt/static_dependencies/ecdsa/keys.py +0 -332
- coinex_api/ccxt/static_dependencies/ecdsa/numbertheory.py +0 -531
- coinex_api/ccxt/static_dependencies/ecdsa/rfc6979.py +0 -100
- coinex_api/ccxt/static_dependencies/ecdsa/util.py +0 -266
- coinex_api/ccxt/static_dependencies/ethereum/__init__.py +0 -7
- coinex_api/ccxt/static_dependencies/ethereum/abi/__init__.py +0 -16
- coinex_api/ccxt/static_dependencies/ethereum/abi/abi.py +0 -19
- coinex_api/ccxt/static_dependencies/ethereum/abi/base.py +0 -152
- coinex_api/ccxt/static_dependencies/ethereum/abi/codec.py +0 -217
- coinex_api/ccxt/static_dependencies/ethereum/abi/constants.py +0 -3
- coinex_api/ccxt/static_dependencies/ethereum/abi/decoding.py +0 -565
- coinex_api/ccxt/static_dependencies/ethereum/abi/encoding.py +0 -720
- coinex_api/ccxt/static_dependencies/ethereum/abi/exceptions.py +0 -139
- coinex_api/ccxt/static_dependencies/ethereum/abi/grammar.py +0 -443
- coinex_api/ccxt/static_dependencies/ethereum/abi/packed.py +0 -13
- coinex_api/ccxt/static_dependencies/ethereum/abi/py.typed +0 -0
- coinex_api/ccxt/static_dependencies/ethereum/abi/registry.py +0 -643
- coinex_api/ccxt/static_dependencies/ethereum/abi/tools/__init__.py +0 -3
- coinex_api/ccxt/static_dependencies/ethereum/abi/tools/_strategies.py +0 -230
- coinex_api/ccxt/static_dependencies/ethereum/abi/utils/__init__.py +0 -0
- coinex_api/ccxt/static_dependencies/ethereum/abi/utils/numeric.py +0 -83
- coinex_api/ccxt/static_dependencies/ethereum/abi/utils/padding.py +0 -27
- coinex_api/ccxt/static_dependencies/ethereum/abi/utils/string.py +0 -19
- coinex_api/ccxt/static_dependencies/ethereum/account/__init__.py +0 -3
- coinex_api/ccxt/static_dependencies/ethereum/account/encode_typed_data/__init__.py +0 -4
- coinex_api/ccxt/static_dependencies/ethereum/account/encode_typed_data/encoding_and_hashing.py +0 -239
- coinex_api/ccxt/static_dependencies/ethereum/account/encode_typed_data/helpers.py +0 -40
- coinex_api/ccxt/static_dependencies/ethereum/account/messages.py +0 -263
- coinex_api/ccxt/static_dependencies/ethereum/account/py.typed +0 -0
- coinex_api/ccxt/static_dependencies/ethereum/hexbytes/__init__.py +0 -5
- coinex_api/ccxt/static_dependencies/ethereum/hexbytes/_utils.py +0 -54
- coinex_api/ccxt/static_dependencies/ethereum/hexbytes/main.py +0 -65
- coinex_api/ccxt/static_dependencies/ethereum/hexbytes/py.typed +0 -0
- coinex_api/ccxt/static_dependencies/ethereum/typing/__init__.py +0 -63
- coinex_api/ccxt/static_dependencies/ethereum/typing/abi.py +0 -6
- coinex_api/ccxt/static_dependencies/ethereum/typing/bls.py +0 -7
- coinex_api/ccxt/static_dependencies/ethereum/typing/discovery.py +0 -5
- coinex_api/ccxt/static_dependencies/ethereum/typing/encoding.py +0 -7
- coinex_api/ccxt/static_dependencies/ethereum/typing/enums.py +0 -17
- coinex_api/ccxt/static_dependencies/ethereum/typing/ethpm.py +0 -9
- coinex_api/ccxt/static_dependencies/ethereum/typing/evm.py +0 -20
- coinex_api/ccxt/static_dependencies/ethereum/typing/networks.py +0 -1122
- coinex_api/ccxt/static_dependencies/ethereum/typing/py.typed +0 -0
- coinex_api/ccxt/static_dependencies/ethereum/utils/__init__.py +0 -115
- coinex_api/ccxt/static_dependencies/ethereum/utils/abi.py +0 -72
- coinex_api/ccxt/static_dependencies/ethereum/utils/address.py +0 -171
- coinex_api/ccxt/static_dependencies/ethereum/utils/applicators.py +0 -151
- coinex_api/ccxt/static_dependencies/ethereum/utils/conversions.py +0 -190
- coinex_api/ccxt/static_dependencies/ethereum/utils/currency.py +0 -107
- coinex_api/ccxt/static_dependencies/ethereum/utils/curried/__init__.py +0 -269
- coinex_api/ccxt/static_dependencies/ethereum/utils/debug.py +0 -20
- coinex_api/ccxt/static_dependencies/ethereum/utils/decorators.py +0 -132
- coinex_api/ccxt/static_dependencies/ethereum/utils/encoding.py +0 -6
- coinex_api/ccxt/static_dependencies/ethereum/utils/exceptions.py +0 -4
- coinex_api/ccxt/static_dependencies/ethereum/utils/functional.py +0 -75
- coinex_api/ccxt/static_dependencies/ethereum/utils/hexadecimal.py +0 -74
- coinex_api/ccxt/static_dependencies/ethereum/utils/humanize.py +0 -188
- coinex_api/ccxt/static_dependencies/ethereum/utils/logging.py +0 -159
- coinex_api/ccxt/static_dependencies/ethereum/utils/module_loading.py +0 -31
- coinex_api/ccxt/static_dependencies/ethereum/utils/numeric.py +0 -43
- coinex_api/ccxt/static_dependencies/ethereum/utils/py.typed +0 -0
- coinex_api/ccxt/static_dependencies/ethereum/utils/toolz.py +0 -76
- coinex_api/ccxt/static_dependencies/ethereum/utils/types.py +0 -54
- coinex_api/ccxt/static_dependencies/ethereum/utils/typing/__init__.py +0 -18
- coinex_api/ccxt/static_dependencies/ethereum/utils/typing/misc.py +0 -14
- coinex_api/ccxt/static_dependencies/ethereum/utils/units.py +0 -31
- coinex_api/ccxt/static_dependencies/keccak/__init__.py +0 -3
- coinex_api/ccxt/static_dependencies/keccak/keccak.py +0 -197
- coinex_api/ccxt/static_dependencies/lark/__init__.py +0 -38
- coinex_api/ccxt/static_dependencies/lark/__pyinstaller/__init__.py +0 -6
- coinex_api/ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +0 -14
- coinex_api/ccxt/static_dependencies/lark/ast_utils.py +0 -59
- coinex_api/ccxt/static_dependencies/lark/common.py +0 -86
- coinex_api/ccxt/static_dependencies/lark/exceptions.py +0 -292
- coinex_api/ccxt/static_dependencies/lark/grammar.py +0 -130
- coinex_api/ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
- coinex_api/ccxt/static_dependencies/lark/grammars/common.lark +0 -59
- coinex_api/ccxt/static_dependencies/lark/grammars/lark.lark +0 -62
- coinex_api/ccxt/static_dependencies/lark/grammars/python.lark +0 -302
- coinex_api/ccxt/static_dependencies/lark/grammars/unicode.lark +0 -7
- coinex_api/ccxt/static_dependencies/lark/indenter.py +0 -143
- coinex_api/ccxt/static_dependencies/lark/lark.py +0 -658
- coinex_api/ccxt/static_dependencies/lark/lexer.py +0 -678
- coinex_api/ccxt/static_dependencies/lark/load_grammar.py +0 -1428
- coinex_api/ccxt/static_dependencies/lark/parse_tree_builder.py +0 -391
- coinex_api/ccxt/static_dependencies/lark/parser_frontends.py +0 -257
- coinex_api/ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
- coinex_api/ccxt/static_dependencies/lark/parsers/cyk.py +0 -340
- coinex_api/ccxt/static_dependencies/lark/parsers/earley.py +0 -314
- coinex_api/ccxt/static_dependencies/lark/parsers/earley_common.py +0 -42
- coinex_api/ccxt/static_dependencies/lark/parsers/earley_forest.py +0 -801
- coinex_api/ccxt/static_dependencies/lark/parsers/grammar_analysis.py +0 -203
- coinex_api/ccxt/static_dependencies/lark/parsers/lalr_analysis.py +0 -332
- coinex_api/ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +0 -158
- coinex_api/ccxt/static_dependencies/lark/parsers/lalr_parser.py +0 -122
- coinex_api/ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +0 -110
- coinex_api/ccxt/static_dependencies/lark/parsers/xearley.py +0 -165
- coinex_api/ccxt/static_dependencies/lark/py.typed +0 -0
- coinex_api/ccxt/static_dependencies/lark/reconstruct.py +0 -107
- coinex_api/ccxt/static_dependencies/lark/tools/__init__.py +0 -70
- coinex_api/ccxt/static_dependencies/lark/tools/nearley.py +0 -202
- coinex_api/ccxt/static_dependencies/lark/tools/serialize.py +0 -32
- coinex_api/ccxt/static_dependencies/lark/tools/standalone.py +0 -196
- coinex_api/ccxt/static_dependencies/lark/tree.py +0 -267
- coinex_api/ccxt/static_dependencies/lark/tree_matcher.py +0 -186
- coinex_api/ccxt/static_dependencies/lark/tree_templates.py +0 -180
- coinex_api/ccxt/static_dependencies/lark/utils.py +0 -343
- coinex_api/ccxt/static_dependencies/lark/visitors.py +0 -596
- coinex_api/ccxt/static_dependencies/marshmallow/__init__.py +0 -81
- coinex_api/ccxt/static_dependencies/marshmallow/base.py +0 -65
- coinex_api/ccxt/static_dependencies/marshmallow/class_registry.py +0 -94
- coinex_api/ccxt/static_dependencies/marshmallow/decorators.py +0 -231
- coinex_api/ccxt/static_dependencies/marshmallow/error_store.py +0 -60
- coinex_api/ccxt/static_dependencies/marshmallow/exceptions.py +0 -71
- coinex_api/ccxt/static_dependencies/marshmallow/fields.py +0 -2114
- coinex_api/ccxt/static_dependencies/marshmallow/orderedset.py +0 -89
- coinex_api/ccxt/static_dependencies/marshmallow/py.typed +0 -0
- coinex_api/ccxt/static_dependencies/marshmallow/schema.py +0 -1228
- coinex_api/ccxt/static_dependencies/marshmallow/types.py +0 -12
- coinex_api/ccxt/static_dependencies/marshmallow/utils.py +0 -378
- coinex_api/ccxt/static_dependencies/marshmallow/validate.py +0 -678
- coinex_api/ccxt/static_dependencies/marshmallow/warnings.py +0 -2
- coinex_api/ccxt/static_dependencies/marshmallow_dataclass/__init__.py +0 -1047
- coinex_api/ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +0 -51
- coinex_api/ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +0 -45
- coinex_api/ccxt/static_dependencies/marshmallow_dataclass/mypy.py +0 -71
- coinex_api/ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
- coinex_api/ccxt/static_dependencies/marshmallow_dataclass/typing.py +0 -14
- coinex_api/ccxt/static_dependencies/marshmallow_dataclass/union_field.py +0 -82
- coinex_api/ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +0 -1
- coinex_api/ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +0 -193
- coinex_api/ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
- coinex_api/ccxt/static_dependencies/msgpack/__init__.py +0 -55
- coinex_api/ccxt/static_dependencies/msgpack/_cmsgpack.pyx +0 -11
- coinex_api/ccxt/static_dependencies/msgpack/_packer.pyx +0 -374
- coinex_api/ccxt/static_dependencies/msgpack/_unpacker.pyx +0 -547
- coinex_api/ccxt/static_dependencies/msgpack/buff_converter.h +0 -8
- coinex_api/ccxt/static_dependencies/msgpack/exceptions.py +0 -48
- coinex_api/ccxt/static_dependencies/msgpack/ext.py +0 -168
- coinex_api/ccxt/static_dependencies/msgpack/fallback.py +0 -951
- coinex_api/ccxt/static_dependencies/msgpack/pack.h +0 -89
- coinex_api/ccxt/static_dependencies/msgpack/pack_template.h +0 -820
- coinex_api/ccxt/static_dependencies/msgpack/sysdep.h +0 -194
- coinex_api/ccxt/static_dependencies/msgpack/unpack.h +0 -391
- coinex_api/ccxt/static_dependencies/msgpack/unpack_define.h +0 -95
- coinex_api/ccxt/static_dependencies/msgpack/unpack_template.h +0 -464
- coinex_api/ccxt/static_dependencies/parsimonious/__init__.py +0 -10
- coinex_api/ccxt/static_dependencies/parsimonious/exceptions.py +0 -105
- coinex_api/ccxt/static_dependencies/parsimonious/expressions.py +0 -479
- coinex_api/ccxt/static_dependencies/parsimonious/grammar.py +0 -487
- coinex_api/ccxt/static_dependencies/parsimonious/nodes.py +0 -325
- coinex_api/ccxt/static_dependencies/parsimonious/utils.py +0 -40
- coinex_api/ccxt/static_dependencies/starknet/__init__.py +0 -0
- coinex_api/ccxt/static_dependencies/starknet/abi/v0/__init__.py +0 -2
- coinex_api/ccxt/static_dependencies/starknet/abi/v0/model.py +0 -44
- coinex_api/ccxt/static_dependencies/starknet/abi/v0/parser.py +0 -216
- coinex_api/ccxt/static_dependencies/starknet/abi/v0/schemas.py +0 -72
- coinex_api/ccxt/static_dependencies/starknet/abi/v0/shape.py +0 -63
- coinex_api/ccxt/static_dependencies/starknet/abi/v1/__init__.py +0 -2
- coinex_api/ccxt/static_dependencies/starknet/abi/v1/core_structures.json +0 -14
- coinex_api/ccxt/static_dependencies/starknet/abi/v1/model.py +0 -39
- coinex_api/ccxt/static_dependencies/starknet/abi/v1/parser.py +0 -220
- coinex_api/ccxt/static_dependencies/starknet/abi/v1/parser_transformer.py +0 -179
- coinex_api/ccxt/static_dependencies/starknet/abi/v1/schemas.py +0 -66
- coinex_api/ccxt/static_dependencies/starknet/abi/v1/shape.py +0 -47
- coinex_api/ccxt/static_dependencies/starknet/abi/v2/__init__.py +0 -2
- coinex_api/ccxt/static_dependencies/starknet/abi/v2/model.py +0 -89
- coinex_api/ccxt/static_dependencies/starknet/abi/v2/parser.py +0 -293
- coinex_api/ccxt/static_dependencies/starknet/abi/v2/parser_transformer.py +0 -192
- coinex_api/ccxt/static_dependencies/starknet/abi/v2/schemas.py +0 -132
- coinex_api/ccxt/static_dependencies/starknet/abi/v2/shape.py +0 -107
- coinex_api/ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
- coinex_api/ccxt/static_dependencies/starknet/cairo/data_types.py +0 -123
- coinex_api/ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
- coinex_api/ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +0 -77
- coinex_api/ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +0 -46
- coinex_api/ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +0 -138
- coinex_api/ccxt/static_dependencies/starknet/cairo/felt.py +0 -64
- coinex_api/ccxt/static_dependencies/starknet/cairo/type_parser.py +0 -121
- coinex_api/ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
- coinex_api/ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +0 -59
- coinex_api/ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
- coinex_api/ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +0 -77
- coinex_api/ccxt/static_dependencies/starknet/ccxt_utils.py +0 -7
- coinex_api/ccxt/static_dependencies/starknet/common.py +0 -15
- coinex_api/ccxt/static_dependencies/starknet/constants.py +0 -39
- coinex_api/ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
- coinex_api/ccxt/static_dependencies/starknet/hash/address.py +0 -79
- coinex_api/ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +0 -111
- coinex_api/ccxt/static_dependencies/starknet/hash/selector.py +0 -16
- coinex_api/ccxt/static_dependencies/starknet/hash/storage.py +0 -12
- coinex_api/ccxt/static_dependencies/starknet/hash/utils.py +0 -78
- coinex_api/ccxt/static_dependencies/starknet/models/__init__.py +0 -0
- coinex_api/ccxt/static_dependencies/starknet/models/typed_data.py +0 -45
- coinex_api/ccxt/static_dependencies/starknet/serialization/__init__.py +0 -24
- coinex_api/ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +0 -40
- coinex_api/ccxt/static_dependencies/starknet/serialization/_context.py +0 -142
- coinex_api/ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +0 -10
- coinex_api/ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +0 -82
- coinex_api/ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +0 -43
- coinex_api/ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +0 -37
- coinex_api/ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +0 -66
- coinex_api/ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +0 -71
- coinex_api/ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +0 -71
- coinex_api/ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +0 -50
- coinex_api/ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +0 -58
- coinex_api/ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +0 -43
- coinex_api/ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +0 -40
- coinex_api/ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +0 -72
- coinex_api/ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +0 -36
- coinex_api/ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +0 -36
- coinex_api/ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +0 -76
- coinex_api/ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +0 -100
- coinex_api/ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +0 -32
- coinex_api/ccxt/static_dependencies/starknet/serialization/errors.py +0 -10
- coinex_api/ccxt/static_dependencies/starknet/serialization/factory.py +0 -229
- coinex_api/ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +0 -110
- coinex_api/ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +0 -59
- coinex_api/ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
- coinex_api/ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +0 -86
- coinex_api/ccxt/static_dependencies/starknet/utils/iterable.py +0 -13
- coinex_api/ccxt/static_dependencies/starknet/utils/schema.py +0 -13
- coinex_api/ccxt/static_dependencies/starknet/utils/typed_data.py +0 -182
- coinex_api/ccxt/static_dependencies/starkware/__init__.py +0 -0
- coinex_api/ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
- coinex_api/ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +0 -50
- coinex_api/ccxt/static_dependencies/starkware/crypto/math_utils.py +0 -78
- coinex_api/ccxt/static_dependencies/starkware/crypto/signature.py +0 -2344
- coinex_api/ccxt/static_dependencies/starkware/crypto/utils.py +0 -63
- coinex_api/ccxt/static_dependencies/sympy/__init__.py +0 -0
- coinex_api/ccxt/static_dependencies/sympy/core/__init__.py +0 -0
- coinex_api/ccxt/static_dependencies/sympy/core/intfunc.py +0 -35
- coinex_api/ccxt/static_dependencies/sympy/external/__init__.py +0 -0
- coinex_api/ccxt/static_dependencies/sympy/external/gmpy.py +0 -345
- coinex_api/ccxt/static_dependencies/sympy/external/importtools.py +0 -187
- coinex_api/ccxt/static_dependencies/sympy/external/ntheory.py +0 -637
- coinex_api/ccxt/static_dependencies/sympy/external/pythonmpq.py +0 -341
- coinex_api/ccxt/static_dependencies/toolz/__init__.py +0 -26
- coinex_api/ccxt/static_dependencies/toolz/_signatures.py +0 -784
- coinex_api/ccxt/static_dependencies/toolz/_version.py +0 -520
- coinex_api/ccxt/static_dependencies/toolz/compatibility.py +0 -30
- coinex_api/ccxt/static_dependencies/toolz/curried/__init__.py +0 -101
- coinex_api/ccxt/static_dependencies/toolz/curried/exceptions.py +0 -22
- coinex_api/ccxt/static_dependencies/toolz/curried/operator.py +0 -22
- coinex_api/ccxt/static_dependencies/toolz/dicttoolz.py +0 -339
- coinex_api/ccxt/static_dependencies/toolz/functoolz.py +0 -1049
- coinex_api/ccxt/static_dependencies/toolz/itertoolz.py +0 -1057
- coinex_api/ccxt/static_dependencies/toolz/recipes.py +0 -46
- coinex_api/ccxt/static_dependencies/toolz/utils.py +0 -9
- coinex_api/ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
- coinex_api/ccxt/static_dependencies/typing_inspect/typing_inspect.py +0 -851
- coinex_api-0.0.7.dist-info/METADATA +0 -62
- coinex_api-0.0.7.dist-info/RECORD +0 -288
- {coinex_api-0.0.7.dist-info → coinex_api-0.0.9.dist-info}/WHEEL +0 -0
@@ -1,197 +0,0 @@
|
|
1
|
-
#! /usr/bin/env python
|
2
|
-
#
|
3
|
-
# Implementation of elliptic curves, for cryptographic applications.
|
4
|
-
#
|
5
|
-
# This module doesn't provide any way to choose a random elliptic
|
6
|
-
# curve, nor to verify that an elliptic curve was chosen randomly,
|
7
|
-
# because one can simply use NIST's standard curves.
|
8
|
-
#
|
9
|
-
# Notes from X9.62-1998 (draft):
|
10
|
-
# Nomenclature:
|
11
|
-
# - Q is a public key.
|
12
|
-
# The "Elliptic Curve Domain Parameters" include:
|
13
|
-
# - q is the "field size", which in our case equals p.
|
14
|
-
# - p is a big prime.
|
15
|
-
# - G is a point of prime order (5.1.1.1).
|
16
|
-
# - n is the order of G (5.1.1.1).
|
17
|
-
# Public-key validation (5.2.2):
|
18
|
-
# - Verify that Q is not the point at infinity.
|
19
|
-
# - Verify that X_Q and Y_Q are in [0,p-1].
|
20
|
-
# - Verify that Q is on the curve.
|
21
|
-
# - Verify that nQ is the point at infinity.
|
22
|
-
# Signature generation (5.3):
|
23
|
-
# - Pick random k from [1,n-1].
|
24
|
-
# Signature checking (5.4.2):
|
25
|
-
# - Verify that r and s are in [1,n-1].
|
26
|
-
#
|
27
|
-
# Version of 2008.11.25.
|
28
|
-
#
|
29
|
-
# Revision history:
|
30
|
-
# 2005.12.31 - Initial version.
|
31
|
-
# 2008.11.25 - Change CurveFp.is_on to contains_point.
|
32
|
-
#
|
33
|
-
# Written in 2005 by Peter Pearson and placed in the public domain.
|
34
|
-
|
35
|
-
from __future__ import division
|
36
|
-
|
37
|
-
from . import numbertheory
|
38
|
-
|
39
|
-
|
40
|
-
class CurveFp(object):
|
41
|
-
"""Elliptic Curve over the field of integers modulo a prime."""
|
42
|
-
|
43
|
-
def __init__(self, p, a, b):
|
44
|
-
"""The curve of points satisfying y^2 = x^3 + a*x + b (mod p)."""
|
45
|
-
self.__p = p
|
46
|
-
self.__a = a
|
47
|
-
self.__b = b
|
48
|
-
|
49
|
-
def p(self):
|
50
|
-
return self.__p
|
51
|
-
|
52
|
-
def a(self):
|
53
|
-
return self.__a
|
54
|
-
|
55
|
-
def b(self):
|
56
|
-
return self.__b
|
57
|
-
|
58
|
-
def contains_point(self, x, y):
|
59
|
-
"""Is the point (x,y) on this curve?"""
|
60
|
-
return (y * y - (x * x * x + self.__a * x + self.__b)) % self.__p == 0
|
61
|
-
|
62
|
-
def __str__(self):
|
63
|
-
return "CurveFp(p=%d, a=%d, b=%d)" % (self.__p, self.__a, self.__b)
|
64
|
-
|
65
|
-
|
66
|
-
class Point(object):
|
67
|
-
"""A point on an elliptic curve. Altering x and y is forbidding,
|
68
|
-
but they can be read by the x() and y() methods."""
|
69
|
-
|
70
|
-
def __init__(self, curve, x, y, order=None):
|
71
|
-
"""curve, x, y, order; order (optional) is the order of this point."""
|
72
|
-
self.__curve = curve
|
73
|
-
self.__x = x
|
74
|
-
self.__y = y
|
75
|
-
self.__order = order
|
76
|
-
# self.curve is allowed to be None only for INFINITY:
|
77
|
-
if self.__curve:
|
78
|
-
assert self.__curve.contains_point(x, y)
|
79
|
-
if order:
|
80
|
-
assert self * order == INFINITY
|
81
|
-
|
82
|
-
def __eq__(self, other):
|
83
|
-
"""Return True if the points are identical, False otherwise."""
|
84
|
-
if self.__curve == other.__curve \
|
85
|
-
and self.__x == other.__x \
|
86
|
-
and self.__y == other.__y:
|
87
|
-
return True
|
88
|
-
else:
|
89
|
-
return False
|
90
|
-
|
91
|
-
def __add__(self, other):
|
92
|
-
"""Add one point to another point."""
|
93
|
-
|
94
|
-
# X9.62 B.3:
|
95
|
-
|
96
|
-
if other == INFINITY:
|
97
|
-
return self
|
98
|
-
if self == INFINITY:
|
99
|
-
return other
|
100
|
-
assert self.__curve == other.__curve
|
101
|
-
if self.__x == other.__x:
|
102
|
-
if (self.__y + other.__y) % self.__curve.p() == 0:
|
103
|
-
return INFINITY
|
104
|
-
else:
|
105
|
-
return self.double()
|
106
|
-
|
107
|
-
p = self.__curve.p()
|
108
|
-
|
109
|
-
l = ((other.__y - self.__y) * \
|
110
|
-
numbertheory.inverse_mod(other.__x - self.__x, p)) % p
|
111
|
-
|
112
|
-
x3 = (l * l - self.__x - other.__x) % p
|
113
|
-
y3 = (l * (self.__x - x3) - self.__y) % p
|
114
|
-
|
115
|
-
return Point(self.__curve, x3, y3)
|
116
|
-
|
117
|
-
def __mul__(self, other):
|
118
|
-
"""Multiply a point by an integer."""
|
119
|
-
|
120
|
-
def leftmost_bit(x):
|
121
|
-
assert x > 0
|
122
|
-
result = 1
|
123
|
-
while result <= x:
|
124
|
-
result = 2 * result
|
125
|
-
return result // 2
|
126
|
-
|
127
|
-
e = other
|
128
|
-
if self.__order:
|
129
|
-
e = e % self.__order
|
130
|
-
if e == 0:
|
131
|
-
return INFINITY
|
132
|
-
if self == INFINITY:
|
133
|
-
return INFINITY
|
134
|
-
assert e > 0
|
135
|
-
|
136
|
-
# From X9.62 D.3.2:
|
137
|
-
|
138
|
-
e3 = 3 * e
|
139
|
-
negative_self = Point(self.__curve, self.__x, -self.__y, self.__order)
|
140
|
-
i = leftmost_bit(e3) // 2
|
141
|
-
result = self
|
142
|
-
# print_("Multiplying %s by %d (e3 = %d):" % (self, other, e3))
|
143
|
-
while i > 1:
|
144
|
-
result = result.double()
|
145
|
-
if (e3 & i) != 0 and (e & i) == 0:
|
146
|
-
result = result + self
|
147
|
-
if (e3 & i) == 0 and (e & i) != 0:
|
148
|
-
result = result + negative_self
|
149
|
-
# print_(". . . i = %d, result = %s" % ( i, result ))
|
150
|
-
i = i // 2
|
151
|
-
|
152
|
-
return result
|
153
|
-
|
154
|
-
def __rmul__(self, other):
|
155
|
-
"""Multiply a point by an integer."""
|
156
|
-
|
157
|
-
return self * other
|
158
|
-
|
159
|
-
def __str__(self):
|
160
|
-
if self == INFINITY:
|
161
|
-
return "infinity"
|
162
|
-
return "(%d,%d)" % (self.__x, self.__y)
|
163
|
-
|
164
|
-
def double(self):
|
165
|
-
"""Return a new point that is twice the old."""
|
166
|
-
|
167
|
-
if self == INFINITY:
|
168
|
-
return INFINITY
|
169
|
-
|
170
|
-
# X9.62 B.3:
|
171
|
-
|
172
|
-
p = self.__curve.p()
|
173
|
-
a = self.__curve.a()
|
174
|
-
|
175
|
-
l = ((3 * self.__x * self.__x + a) * \
|
176
|
-
numbertheory.inverse_mod(2 * self.__y, p)) % p
|
177
|
-
|
178
|
-
x3 = (l * l - 2 * self.__x) % p
|
179
|
-
y3 = (l * (self.__x - x3) - self.__y) % p
|
180
|
-
|
181
|
-
return Point(self.__curve, x3, y3)
|
182
|
-
|
183
|
-
def x(self):
|
184
|
-
return self.__x
|
185
|
-
|
186
|
-
def y(self):
|
187
|
-
return self.__y
|
188
|
-
|
189
|
-
def curve(self):
|
190
|
-
return self.__curve
|
191
|
-
|
192
|
-
def order(self):
|
193
|
-
return self.__order
|
194
|
-
|
195
|
-
|
196
|
-
# This one point is the Point At Infinity for all purposes:
|
197
|
-
INFINITY = Point(None, None, None)
|
@@ -1,332 +0,0 @@
|
|
1
|
-
import binascii
|
2
|
-
|
3
|
-
from . import ecdsa
|
4
|
-
from . import der
|
5
|
-
from . import rfc6979
|
6
|
-
from .curves import NIST192p, find_curve
|
7
|
-
from .ecdsa import RSZeroError
|
8
|
-
from .util import string_to_number, number_to_string, randrange
|
9
|
-
from .util import sigencode_string, sigdecode_string
|
10
|
-
from .util import oid_ecPublicKey, encoded_oid_ecPublicKey
|
11
|
-
from hashlib import sha1
|
12
|
-
|
13
|
-
|
14
|
-
class BadSignatureError(Exception):
|
15
|
-
pass
|
16
|
-
|
17
|
-
|
18
|
-
class BadDigestError(Exception):
|
19
|
-
pass
|
20
|
-
|
21
|
-
|
22
|
-
class VerifyingKey:
|
23
|
-
def __init__(self, _error__please_use_generate=None):
|
24
|
-
if not _error__please_use_generate:
|
25
|
-
raise TypeError("Please use VerifyingKey.generate() to "
|
26
|
-
"construct me")
|
27
|
-
|
28
|
-
@classmethod
|
29
|
-
def from_public_point(klass, point, curve=NIST192p, hashfunc=sha1):
|
30
|
-
self = klass(_error__please_use_generate=True)
|
31
|
-
self.curve = curve
|
32
|
-
self.default_hashfunc = hashfunc
|
33
|
-
self.pubkey = ecdsa.Public_key(curve.generator, point)
|
34
|
-
self.pubkey.order = curve.order
|
35
|
-
return self
|
36
|
-
|
37
|
-
@classmethod
|
38
|
-
def from_string(klass, string, curve=NIST192p, hashfunc=sha1,
|
39
|
-
validate_point=True):
|
40
|
-
order = curve.order
|
41
|
-
assert (len(string) == curve.verifying_key_length), \
|
42
|
-
(len(string), curve.verifying_key_length)
|
43
|
-
xs = string[:curve.baselen]
|
44
|
-
ys = string[curve.baselen:]
|
45
|
-
assert len(xs) == curve.baselen, (len(xs), curve.baselen)
|
46
|
-
assert len(ys) == curve.baselen, (len(ys), curve.baselen)
|
47
|
-
x = string_to_number(xs)
|
48
|
-
y = string_to_number(ys)
|
49
|
-
if validate_point:
|
50
|
-
assert ecdsa.point_is_valid(curve.generator, x, y)
|
51
|
-
from . import ellipticcurve
|
52
|
-
point = ellipticcurve.Point(curve.curve, x, y, order)
|
53
|
-
return klass.from_public_point(point, curve, hashfunc)
|
54
|
-
|
55
|
-
@classmethod
|
56
|
-
def from_pem(klass, string):
|
57
|
-
return klass.from_der(der.unpem(string))
|
58
|
-
|
59
|
-
@classmethod
|
60
|
-
def from_der(klass, string):
|
61
|
-
# [[oid_ecPublicKey,oid_curve], point_str_bitstring]
|
62
|
-
s1, empty = der.remove_sequence(string)
|
63
|
-
if empty != b'':
|
64
|
-
raise der.UnexpectedDER("trailing junk after DER pubkey: %s" %
|
65
|
-
binascii.hexlify(empty))
|
66
|
-
s2, point_str_bitstring = der.remove_sequence(s1)
|
67
|
-
# s2 = oid_ecPublicKey,oid_curve
|
68
|
-
oid_pk, rest = der.remove_object(s2)
|
69
|
-
oid_curve, empty = der.remove_object(rest)
|
70
|
-
if empty != b'':
|
71
|
-
raise der.UnexpectedDER("trailing junk after DER pubkey objects: %s" %
|
72
|
-
binascii.hexlify(empty))
|
73
|
-
assert oid_pk == oid_ecPublicKey, (oid_pk, oid_ecPublicKey)
|
74
|
-
curve = find_curve(oid_curve)
|
75
|
-
point_str, empty = der.remove_bitstring(point_str_bitstring)
|
76
|
-
if empty != b'':
|
77
|
-
raise der.UnexpectedDER("trailing junk after pubkey pointstring: %s" %
|
78
|
-
binascii.hexlify(empty))
|
79
|
-
assert point_str.startswith(b'\x00\x04')
|
80
|
-
return klass.from_string(point_str[2:], curve)
|
81
|
-
|
82
|
-
@classmethod
|
83
|
-
def from_public_key_recovery(klass, signature, data, curve, hashfunc=sha1, sigdecode=sigdecode_string):
|
84
|
-
# Given a signature and corresponding message this function
|
85
|
-
# returns a list of verifying keys for this signature and message
|
86
|
-
|
87
|
-
digest = hashfunc(data).digest()
|
88
|
-
return klass.from_public_key_recovery_with_digest(signature, digest, curve, hashfunc=sha1, sigdecode=sigdecode)
|
89
|
-
|
90
|
-
@classmethod
|
91
|
-
def from_public_key_recovery_with_digest(klass, signature, digest, curve, hashfunc=sha1, sigdecode=sigdecode_string):
|
92
|
-
# Given a signature and corresponding digest this function
|
93
|
-
# returns a list of verifying keys for this signature and message
|
94
|
-
|
95
|
-
generator = curve.generator
|
96
|
-
r, s = sigdecode(signature, generator.order())
|
97
|
-
sig = ecdsa.Signature(r, s)
|
98
|
-
|
99
|
-
digest_as_number = string_to_number(digest)
|
100
|
-
pks = sig.recover_public_keys(digest_as_number, generator)
|
101
|
-
|
102
|
-
# Transforms the ecdsa.Public_key object into a VerifyingKey
|
103
|
-
verifying_keys = [klass.from_public_point(pk.point, curve, hashfunc) for pk in pks]
|
104
|
-
return verifying_keys
|
105
|
-
|
106
|
-
def to_string(self):
|
107
|
-
# VerifyingKey.from_string(vk.to_string()) == vk as long as the
|
108
|
-
# curves are the same: the curve itself is not included in the
|
109
|
-
# serialized form
|
110
|
-
order = self.pubkey.order
|
111
|
-
x_str = number_to_string(self.pubkey.point.x(), order)
|
112
|
-
y_str = number_to_string(self.pubkey.point.y(), order)
|
113
|
-
return x_str + y_str
|
114
|
-
|
115
|
-
def to_pem(self):
|
116
|
-
return der.topem(self.to_der(), "PUBLIC KEY")
|
117
|
-
|
118
|
-
def to_der(self):
|
119
|
-
order = self.pubkey.order
|
120
|
-
x_str = number_to_string(self.pubkey.point.x(), order)
|
121
|
-
y_str = number_to_string(self.pubkey.point.y(), order)
|
122
|
-
point_str = b'\x00\x04' + x_str + y_str
|
123
|
-
return der.encode_sequence(der.encode_sequence(encoded_oid_ecPublicKey,
|
124
|
-
self.curve.encoded_oid),
|
125
|
-
der.encode_bitstring(point_str))
|
126
|
-
|
127
|
-
def verify(self, signature, data, hashfunc=None, sigdecode=sigdecode_string):
|
128
|
-
hashfunc = hashfunc or self.default_hashfunc
|
129
|
-
digest = hashfunc(data).digest()
|
130
|
-
return self.verify_digest(signature, digest, sigdecode)
|
131
|
-
|
132
|
-
def verify_digest(self, signature, digest, sigdecode=sigdecode_string):
|
133
|
-
if len(digest) > self.curve.baselen:
|
134
|
-
raise BadDigestError("this curve (%s) is too short "
|
135
|
-
"for your digest (%d)" % (self.curve.name,
|
136
|
-
8 * len(digest)))
|
137
|
-
number = string_to_number(digest)
|
138
|
-
r, s = sigdecode(signature, self.pubkey.order)
|
139
|
-
sig = ecdsa.Signature(r, s)
|
140
|
-
if self.pubkey.verifies(number, sig):
|
141
|
-
return True
|
142
|
-
raise BadSignatureError
|
143
|
-
|
144
|
-
|
145
|
-
class SigningKey:
|
146
|
-
def __init__(self, _error__please_use_generate=None):
|
147
|
-
if not _error__please_use_generate:
|
148
|
-
raise TypeError("Please use SigningKey.generate() to construct me")
|
149
|
-
|
150
|
-
@classmethod
|
151
|
-
def generate(klass, curve=NIST192p, entropy=None, hashfunc=sha1):
|
152
|
-
secexp = randrange(curve.order, entropy)
|
153
|
-
return klass.from_secret_exponent(secexp, curve, hashfunc)
|
154
|
-
|
155
|
-
# to create a signing key from a short (arbitrary-length) seed, convert
|
156
|
-
# that seed into an integer with something like
|
157
|
-
# secexp=util.randrange_from_seed__X(seed, curve.order), and then pass
|
158
|
-
# that integer into SigningKey.from_secret_exponent(secexp, curve)
|
159
|
-
|
160
|
-
@classmethod
|
161
|
-
def from_secret_exponent(klass, secexp, curve=NIST192p, hashfunc=sha1):
|
162
|
-
self = klass(_error__please_use_generate=True)
|
163
|
-
self.curve = curve
|
164
|
-
self.default_hashfunc = hashfunc
|
165
|
-
self.baselen = curve.baselen
|
166
|
-
n = curve.order
|
167
|
-
assert 1 <= secexp < n
|
168
|
-
pubkey_point = curve.generator * secexp
|
169
|
-
pubkey = ecdsa.Public_key(curve.generator, pubkey_point)
|
170
|
-
pubkey.order = n
|
171
|
-
self.verifying_key = VerifyingKey.from_public_point(pubkey_point, curve,
|
172
|
-
hashfunc)
|
173
|
-
self.privkey = ecdsa.Private_key(pubkey, secexp)
|
174
|
-
self.privkey.order = n
|
175
|
-
return self
|
176
|
-
|
177
|
-
@classmethod
|
178
|
-
def from_string(klass, string, curve=NIST192p, hashfunc=sha1):
|
179
|
-
assert len(string) == curve.baselen, (len(string), curve.baselen)
|
180
|
-
secexp = string_to_number(string)
|
181
|
-
return klass.from_secret_exponent(secexp, curve, hashfunc)
|
182
|
-
|
183
|
-
@classmethod
|
184
|
-
def from_pem(klass, string, hashfunc=sha1):
|
185
|
-
# the privkey pem file has two sections: "EC PARAMETERS" and "EC
|
186
|
-
# PRIVATE KEY". The first is redundant.
|
187
|
-
if isinstance(string, str):
|
188
|
-
string = string.encode()
|
189
|
-
privkey_pem = string[string.index(b'-----BEGIN EC PRIVATE KEY-----'):]
|
190
|
-
return klass.from_der(der.unpem(privkey_pem), hashfunc)
|
191
|
-
|
192
|
-
@classmethod
|
193
|
-
def from_der(klass, string, hashfunc=sha1):
|
194
|
-
# SEQ([int(1), octetstring(privkey),cont[0], oid(secp224r1),
|
195
|
-
# cont[1],bitstring])
|
196
|
-
s, empty = der.remove_sequence(string)
|
197
|
-
if empty != b'':
|
198
|
-
raise der.UnexpectedDER("trailing junk after DER privkey: %s" %
|
199
|
-
binascii.hexlify(empty))
|
200
|
-
one, s = der.remove_integer(s)
|
201
|
-
if one != 1:
|
202
|
-
raise der.UnexpectedDER("expected '1' at start of DER privkey,"
|
203
|
-
" got %d" % one)
|
204
|
-
privkey_str, s = der.remove_octet_string(s)
|
205
|
-
tag, curve_oid_str, s = der.remove_constructed(s)
|
206
|
-
if tag != 0:
|
207
|
-
raise der.UnexpectedDER("expected tag 0 in DER privkey,"
|
208
|
-
" got %d" % tag)
|
209
|
-
curve_oid, empty = der.remove_object(curve_oid_str)
|
210
|
-
if empty != b'':
|
211
|
-
raise der.UnexpectedDER("trailing junk after DER privkey "
|
212
|
-
"curve_oid: %s" % binascii.hexlify(empty))
|
213
|
-
curve = find_curve(curve_oid)
|
214
|
-
|
215
|
-
# we don't actually care about the following fields
|
216
|
-
#
|
217
|
-
# tag, pubkey_bitstring, s = der.remove_constructed(s)
|
218
|
-
# if tag != 1:
|
219
|
-
# raise der.UnexpectedDER("expected tag 1 in DER privkey, got %d"
|
220
|
-
# % tag)
|
221
|
-
# pubkey_str = der.remove_bitstring(pubkey_bitstring)
|
222
|
-
# if empty != "":
|
223
|
-
# raise der.UnexpectedDER("trailing junk after DER privkey "
|
224
|
-
# "pubkeystr: %s" % binascii.hexlify(empty))
|
225
|
-
|
226
|
-
# our from_string method likes fixed-length privkey strings
|
227
|
-
if len(privkey_str) < curve.baselen:
|
228
|
-
privkey_str = b'\x00' * (curve.baselen - len(privkey_str)) + privkey_str
|
229
|
-
return klass.from_string(privkey_str, curve, hashfunc)
|
230
|
-
|
231
|
-
def to_string(self):
|
232
|
-
secexp = self.privkey.secret_multiplier
|
233
|
-
s = number_to_string(secexp, self.privkey.order)
|
234
|
-
return s
|
235
|
-
|
236
|
-
def to_pem(self):
|
237
|
-
# TODO: "BEGIN ECPARAMETERS"
|
238
|
-
return der.topem(self.to_der(), "EC PRIVATE KEY")
|
239
|
-
|
240
|
-
def to_der(self):
|
241
|
-
# SEQ([int(1), octetstring(privkey),cont[0], oid(secp224r1),
|
242
|
-
# cont[1],bitstring])
|
243
|
-
encoded_vk = b'\x00\x04' + self.get_verifying_key().to_string()
|
244
|
-
return der.encode_sequence(der.encode_integer(1),
|
245
|
-
der.encode_octet_string(self.to_string()),
|
246
|
-
der.encode_constructed(0, self.curve.encoded_oid),
|
247
|
-
der.encode_constructed(1, der.encode_bitstring(encoded_vk)),
|
248
|
-
)
|
249
|
-
|
250
|
-
def get_verifying_key(self):
|
251
|
-
return self.verifying_key
|
252
|
-
|
253
|
-
def sign_deterministic(self, data, hashfunc=None,
|
254
|
-
sigencode=sigencode_string,
|
255
|
-
extra_entropy=b''):
|
256
|
-
hashfunc = hashfunc or self.default_hashfunc
|
257
|
-
digest = hashfunc(data).digest()
|
258
|
-
|
259
|
-
return self.sign_digest_deterministic(
|
260
|
-
digest, hashfunc=hashfunc, sigencode=sigencode,
|
261
|
-
extra_entropy=extra_entropy)
|
262
|
-
|
263
|
-
def sign_digest_deterministic(self, digest, hashfunc=None,
|
264
|
-
sigencode=sigencode_string,
|
265
|
-
extra_entropy=b''):
|
266
|
-
"""
|
267
|
-
Calculates 'k' from data itself, removing the need for strong
|
268
|
-
random generator and producing deterministic (reproducible) signatures.
|
269
|
-
See RFC 6979 for more details.
|
270
|
-
"""
|
271
|
-
secexp = self.privkey.secret_multiplier
|
272
|
-
|
273
|
-
def simple_r_s(r, s, order, v):
|
274
|
-
return r, s, order, v
|
275
|
-
|
276
|
-
retry_gen = 0
|
277
|
-
while True:
|
278
|
-
k = rfc6979.generate_k(
|
279
|
-
self.curve.generator.order(), secexp, hashfunc, digest,
|
280
|
-
retry_gen=retry_gen, extra_entropy=extra_entropy)
|
281
|
-
try:
|
282
|
-
r, s, order, v = self.sign_digest(digest, sigencode=simple_r_s, k=k)
|
283
|
-
break
|
284
|
-
except RSZeroError:
|
285
|
-
retry_gen += 1
|
286
|
-
|
287
|
-
return sigencode(r, s, order, v)
|
288
|
-
|
289
|
-
def sign(self, data, entropy=None, hashfunc=None, sigencode=sigencode_string, k=None):
|
290
|
-
"""
|
291
|
-
hashfunc= should behave like hashlib.sha1 . The output length of the
|
292
|
-
hash (in bytes) must not be longer than the length of the curve order
|
293
|
-
(rounded up to the nearest byte), so using SHA256 with nist256p is
|
294
|
-
ok, but SHA256 with nist192p is not. (In the 2**-96ish unlikely event
|
295
|
-
of a hash output larger than the curve order, the hash will
|
296
|
-
effectively be wrapped mod n).
|
297
|
-
|
298
|
-
Use hashfunc=hashlib.sha1 to match openssl's -ecdsa-with-SHA1 mode,
|
299
|
-
or hashfunc=hashlib.sha256 for openssl-1.0.0's -ecdsa-with-SHA256.
|
300
|
-
"""
|
301
|
-
|
302
|
-
hashfunc = hashfunc or self.default_hashfunc
|
303
|
-
h = hashfunc(data).digest()
|
304
|
-
return self.sign_digest(h, entropy, sigencode, k)
|
305
|
-
|
306
|
-
def sign_digest(self, digest, entropy=None, sigencode=sigencode_string, k=None):
|
307
|
-
if len(digest) > self.curve.baselen:
|
308
|
-
raise BadDigestError("this curve (%s) is too short "
|
309
|
-
"for your digest (%d)" % (self.curve.name,
|
310
|
-
8 * len(digest)))
|
311
|
-
number = string_to_number(digest)
|
312
|
-
r, s, v = self.sign_number(number, entropy, k)
|
313
|
-
return sigencode(r, s, self.privkey.order, v)
|
314
|
-
|
315
|
-
def sign_number(self, number, entropy=None, k=None):
|
316
|
-
# returns a pair of numbers
|
317
|
-
order = self.privkey.order
|
318
|
-
# privkey.sign() may raise RuntimeError in the amazingly unlikely
|
319
|
-
# (2**-192) event that r=0 or s=0, because that would leak the key.
|
320
|
-
# We could re-try with a different 'k', but we couldn't test that
|
321
|
-
# code, so I choose to allow the signature to fail instead.
|
322
|
-
|
323
|
-
# If k is set, it is used directly. In other cases
|
324
|
-
# it is generated using entropy function
|
325
|
-
if k is not None:
|
326
|
-
_k = k
|
327
|
-
else:
|
328
|
-
_k = randrange(order, entropy)
|
329
|
-
|
330
|
-
assert 1 <= _k < order
|
331
|
-
sig = self.privkey.sign(number, _k)
|
332
|
-
return sig.r, sig.s, sig.recovery_param
|