Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pylance crashes when parsing large integers #2279

Closed
Faholan opened this issue Jan 23, 2022 · 6 comments
Closed

Pylance crashes when parsing large integers #2279

Faholan opened this issue Jan 23, 2022 · 6 comments
Labels
bug Something isn't working fixed in next version (main) A fix has been implemented and will appear in an upcoming version

Comments

@Faholan
Copy link

Faholan commented Jan 23, 2022

Environment data

  • Language Server version: 2022.1.3
  • OS and version: Windows 11 21H2
  • Python version (& distribution if applicable, e.g. Anaconda): 3.10.1

Expected behaviour

Pylance should correctly parse large integers

Actual behaviour

Pylance crashes when parsing big integers, stating "RangeError: The number Infinity cannot be converted to a BigInt because it is not an integer"

Logs

[Error - 12:16:45] An internal error occurred while parsing file "c:\Users\Waylander\Documents\Coding\TIPE\tipe\src\core\crypto\config.py": RangeError: The number Infinity cannot be converted to a BigInt because it is not an integer
    at BigInt (<anonymous>)
    at t.Tokenizer._tryNumber (c:\Users\Waylander\.vscode\extensions\ms-python.vscode-pylance-2022.1.3\dist\pyright-internal\src\parser\tokenizer.ts:762:25)
    at t.Tokenizer._handleCharacter (c:\Users\Waylander\.vscode\extensions\ms-python.vscode-pylance-2022.1.3\dist\pyright-internal\src\parser\tokenizer.ts:461:30)
    at t.Tokenizer._addNextToken (c:\Users\Waylander\.vscode\extensions\ms-python.vscode-pylance-2022.1.3\dist\pyright-internal\src\parser\tokenizer.ts:323:19)
    at t.Tokenizer.tokenize (c:\Users\Waylander\.vscode\extensions\ms-python.vscode-pylance-2022.1.3\dist\pyright-internal\src\parser\tokenizer.ts:239:18)
    at T._startNewParse (c:\Users\Waylander\.vscode\extensions\ms-python.vscode-pylance-2022.1.3\dist\pyright-internal\src\parser\parser.ts:322:43)
    at callback (c:\Users\Waylander\.vscode\extensions\ms-python.vscode-pylance-2022.1.3\dist\pyright-internal\src\parser\parser.ts:216:18)
    at i.timeOperation (c:\Users\Waylander\.vscode\extensions\ms-python.vscode-pylance-2022.1.3\dist\pyright-internal\src\common\timing.ts:44:28)
    at T.parseSourceFile (c:\Users\Waylander\.vscode\extensions\ms-python.vscode-pylance-2022.1.3\dist\pyright-internal\src\parser\parser.ts:215:38)
    at c:\Users\Waylander\.vscode\extensions\ms-python.vscode-pylance-2022.1.3\dist\pyright-internal\src\analyzer\sourceFile.ts:643:45

Code Snippet / Additional information

"""Default arguments.

Copyright (C) 2022  Faholan <https://github.com/Faholan>
"""
import typing as t

DEFAULT_RSA = {
    "nlen": 3072,
    "hash_name": "sha3_512",
    "gen_method": "probable_aux_prob",
}

DEFAULT_ECDSA = {
    "curve_name": "frp256v1",
    "hash_name": "sha3_512",
}

FFDHE_FIELDS: t.Dict[str, t.Tuple[int, int, int, int]] = {
    # p: prime, g: generator, minimial secret key size, byte size
    "ffdhe2048": (
        0xFFFFFFFFFFFFFFFFADF85458A2BB4A9AAFDC5620273D3CF1D8B9C583CE2D3695A9E13641146433FBCC939DCE249B3EF97D2FE363630C75D8F681B202AEC4617AD3DF1ED5D5FD65612433F51F5F066ED0856365553DED1AF3B557135E7F57C935984F0C70E0E68B77E2A689DAF3EFE8721DF158A136ADE73530ACCA4F483A797ABC0AB182B324FB61D108A94BB2C8E3FBB96ADAB760D7F4681D4F42A3DE394DF4AE56EDE76372BB190B07A7C8EE0A6D709E02FCE1CDF7E2ECC03404CD28342F619172FE9CE98583FF8E4F1232EEF28183C3FE3B1B4C6FAD733BB5FCBC2EC22005C58EF1837D1683B2C6F34A26C1B2EFFA886B423861285C97FFFFFFFFFFFFFFFF,
        2,
        255,
        256,
    ),
    "ffdhe3072": (
        0xFFFFFFFFFFFFFFFFADF85458A2BB4A9AAFDC5620273D3CF1D8B9C583CE2D3695A9E13641146433FBCC939DCE249B3EF97D2FE363630C75D8F681B202AEC4617AD3DF1ED5D5FD65612433F51F5F066ED0856365553DED1AF3B557135E7F57C935984F0C70E0E68B77E2A689DAF3EFE8721DF158A136ADE73530ACCA4F483A797ABC0AB182B324FB61D108A94BB2C8E3FBB96ADAB760D7F4681D4F42A3DE394DF4AE56EDE76372BB190B07A7C8EE0A6D709E02FCE1CDF7E2ECC03404CD28342F619172FE9CE98583FF8E4F1232EEF28183C3FE3B1B4C6FAD733BB5FCBC2EC22005C58EF1837D1683B2C6F34A26C1B2EFFA886B4238611FCFDCDE355B3B6519035BBC34F4DEF99C023861B46FC9D6E6C9077AD91D2691F7F7EE598CB0FAC186D91CAEFE130985139270B4130C93BC437944F4FD4452E2D74DD364F2E21E71F54BFF5CAE82AB9C9DF69EE86D2BC522363A0DABC521979B0DEADA1DBF9A42D5C4484E0ABCD06BFA53DDEF3C1B20EE3FD59D7C25E41D2B66C62E37FFFFFFFFFFFFFFFF,
        2,
        275,
        384,
    ),
    "ffdhe4096": (
        0xFFFFFFFFFFFFFFFFADF85458A2BB4A9AAFDC5620273D3CF1D8B9C583CE2D3695A9E13641146433FBCC939DCE249B3EF97D2FE363630C75D8F681B202AEC4617AD3DF1ED5D5FD65612433F51F5F066ED0856365553DED1AF3B557135E7F57C935984F0C70E0E68B77E2A689DAF3EFE8721DF158A136ADE73530ACCA4F483A797ABC0AB182B324FB61D108A94BB2C8E3FBB96ADAB760D7F4681D4F42A3DE394DF4AE56EDE76372BB190B07A7C8EE0A6D709E02FCE1CDF7E2ECC03404CD28342F619172FE9CE98583FF8E4F1232EEF28183C3FE3B1B4C6FAD733BB5FCBC2EC22005C58EF1837D1683B2C6F34A26C1B2EFFA886B4238611FCFDCDE355B3B6519035BBC34F4DEF99C023861B46FC9D6E6C9077AD91D2691F7F7EE598CB0FAC186D91CAEFE130985139270B4130C93BC437944F4FD4452E2D74DD364F2E21E71F54BFF5CAE82AB9C9DF69EE86D2BC522363A0DABC521979B0DEADA1DBF9A42D5C4484E0ABCD06BFA53DDEF3C1B20EE3FD59D7C25E41D2B669E1EF16E6F52C3164DF4FB7930E9E4E58857B6AC7D5F42D69F6D187763CF1D5503400487F55BA57E31CC7A7135C886EFB4318AED6A1E012D9E6832A907600A918130C46DC778F971AD0038092999A333CB8B7A1A1DB93D7140003C2A4ECEA9F98D0ACC0A8291CDCEC97DCF8EC9B55A7F88A46B4DB5A851F44182E1C68A007E5E655F6AFFFFFFFFFFFFFFFF,
        2,
        325,
        512,
    ),
    "ffdhe6144": (
        0xFFFFFFFFFFFFFFFFADF85458A2BB4A9AAFDC5620273D3CF1D8B9C583CE2D3695A9E13641146433FBCC939DCE249B3EF97D2FE363630C75D8F681B202AEC4617AD3DF1ED5D5FD65612433F51F5F066ED0856365553DED1AF3B557135E7F57C935984F0C70E0E68B77E2A689DAF3EFE8721DF158A136ADE73530ACCA4F483A797ABC0AB182B324FB61D108A94BB2C8E3FBB96ADAB760D7F4681D4F42A3DE394DF4AE56EDE76372BB190B07A7C8EE0A6D709E02FCE1CDF7E2ECC03404CD28342F619172FE9CE98583FF8E4F1232EEF28183C3FE3B1B4C6FAD733BB5FCBC2EC22005C58EF1837D1683B2C6F34A26C1B2EFFA886B4238611FCFDCDE355B3B6519035BBC34F4DEF99C023861B46FC9D6E6C9077AD91D2691F7F7EE598CB0FAC186D91CAEFE130985139270B4130C93BC437944F4FD4452E2D74DD364F2E21E71F54BFF5CAE82AB9C9DF69EE86D2BC522363A0DABC521979B0DEADA1DBF9A42D5C4484E0ABCD06BFA53DDEF3C1B20EE3FD59D7C25E41D2B669E1EF16E6F52C3164DF4FB7930E9E4E58857B6AC7D5F42D69F6D187763CF1D5503400487F55BA57E31CC7A7135C886EFB4318AED6A1E012D9E6832A907600A918130C46DC778F971AD0038092999A333CB8B7A1A1DB93D7140003C2A4ECEA9F98D0ACC0A8291CDCEC97DCF8EC9B55A7F88A46B4DB5A851F44182E1C68A007E5E0DD9020BFD64B645036C7A4E677D2C38532A3A23BA4442CAF53EA63BB454329B7624C8917BDD64B1C0FD4CB38E8C334C701C3ACDAD0657FCCFEC719B1F5C3E4E46041F388147FB4CFDB477A52471F7A9A96910B855322EDB6340D8A00EF092350511E30ABEC1FFF9E3A26E7FB29F8C183023C3587E38DA0077D9B4763E4E4B94B2BBC194C6651E77CAF992EEAAC0232A281BF6B3A739C1226116820AE8DB5847A67CBEF9C9091B462D538CD72B03746AE77F5E62292C311562A846505DC82DB854338AE49F5235C95B91178CCF2DD5CACEF403EC9D1810C6272B045B3B71F9DC6B80D63FDD4A8E9ADB1E6962A69526D43161C1A41D570D7938DAD4A40E329CD0E40E65FFFFFFFFFFFFFFFF,
        2,
        375,
        768,
    ),
    "ffdhe8192": (
        0xFFFFFFFFFFFFFFFFADF85458A2BB4A9AAFDC5620273D3CF1D8B9C583CE2D3695A9E13641146433FBCC939DCE249B3EF97D2FE363630C75D8F681B202AEC4617AD3DF1ED5D5FD65612433F51F5F066ED0856365553DED1AF3B557135E7F57C935984F0C70E0E68B77E2A689DAF3EFE8721DF158A136ADE73530ACCA4F483A797ABC0AB182B324FB61D108A94BB2C8E3FBB96ADAB760D7F4681D4F42A3DE394DF4AE56EDE76372BB190B07A7C8EE0A6D709E02FCE1CDF7E2ECC03404CD28342F619172FE9CE98583FF8E4F1232EEF28183C3FE3B1B4C6FAD733BB5FCBC2EC22005C58EF1837D1683B2C6F34A26C1B2EFFA886B4238611FCFDCDE355B3B6519035BBC34F4DEF99C023861B46FC9D6E6C9077AD91D2691F7F7EE598CB0FAC186D91CAEFE130985139270B4130C93BC437944F4FD4452E2D74DD364F2E21E71F54BFF5CAE82AB9C9DF69EE86D2BC522363A0DABC521979B0DEADA1DBF9A42D5C4484E0ABCD06BFA53DDEF3C1B20EE3FD59D7C25E41D2B669E1EF16E6F52C3164DF4FB7930E9E4E58857B6AC7D5F42D69F6D187763CF1D5503400487F55BA57E31CC7A7135C886EFB4318AED6A1E012D9E6832A907600A918130C46DC778F971AD0038092999A333CB8B7A1A1DB93D7140003C2A4ECEA9F98D0ACC0A8291CDCEC97DCF8EC9B55A7F88A46B4DB5A851F44182E1C68A007E5E0DD9020BFD64B645036C7A4E677D2C38532A3A23BA4442CAF53EA63BB454329B7624C8917BDD64B1C0FD4CB38E8C334C701C3ACDAD0657FCCFEC719B1F5C3E4E46041F388147FB4CFDB477A52471F7A9A96910B855322EDB6340D8A00EF092350511E30ABEC1FFF9E3A26E7FB29F8C183023C3587E38DA0077D9B4763E4E4B94B2BBC194C6651E77CAF992EEAAC0232A281BF6B3A739C1226116820AE8DB5847A67CBEF9C9091B462D538CD72B03746AE77F5E62292C311562A846505DC82DB854338AE49F5235C95B91178CCF2DD5CACEF403EC9D1810C6272B045B3B71F9DC6B80D63FDD4A8E9ADB1E6962A69526D43161C1A41D570D7938DAD4A40E329CCFF46AAA36AD004CF600C8381E425A31D951AE64FDB23FCEC9509D43687FEB69EDD1CC5E0B8CC3BDF64B10EF86B63142A3AB8829555B2F747C932665CB2C0F1CC01BD70229388839D2AF05E454504AC78B7582822846C0BA35C35F5C59160CC046FD8251541FC68C9C86B022BB7099876A460E7451A8A93109703FEE1C217E6C3826E52C51AA691E0E423CFC99E9E31650C1217B624816CDAD9A95F9D5B8019488D9C0A0A1FE3075A577E23183F81D4A3F2FA4571EFC8CE0BA8A4FE8B6855DFE72B0A66EDED2FBABFBE58A30FAFABE1C5D71A87E2F741EF8C1FE86FEA6BBFDE530677F0D97D11D49F7A8443D0822E506A9F4614E011E2A94838FF88CD68C8BB7C5C6424CFFFFFFFFFFFFFFFF,
        2,
        400,
        1024,
    ),
}
@kevin-he-01
Copy link

One of the shortest valid Python source I found to reproduce this bug is just this literal (A single literal on a line is valid Python):

0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff

The number is 0x followed by 256 fs. It is equal to 2 ** 1024 - 1
I found that any big integer that overflows a Python float (i.e. larger than about 1.7976931348623157e+308) would work, like this:

>>> float(2 ** 1024 - 1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: int too large to convert to float

The overflow explains why the number is being erroneously converted to the floating point infinity in the stack trace.

This bug impacts cryptographic Python scripts or modules that frequently use huge integers as constants.

@kevin-he-01
Copy link

One ugly workaround is to wrap the big number literals xxx in int('xxx', base=0). You need base=0 to accept octal or hexadecimal numbers. Of course eval('xxx') also works but the mere use of eval makes the code look like obfuscated malware in my opinion.

@Faholan
Copy link
Author

Faholan commented Jan 23, 2022

This bug should've been introduced very recently, because when I wrote this code, a few weeks ago, it didn't fail. I guess it must've been introduced in the past week or so

@erictraut
Copy link
Contributor

Thanks for reporting, and sorry for the regression. In the past week, I added support for large integers. But it appears that there are limits beyond which the implementation fails. My test cases tested very large numbers but not very very very large numbers. I'm working on a fix now.

@erictraut
Copy link
Contributor

This will be fixed in the next release.

@erictraut erictraut added bug Something isn't working fixed in next version (main) A fix has been implemented and will appear in an upcoming version and removed triage labels Jan 23, 2022
@debonte
Copy link
Contributor

debonte commented Feb 4, 2022

This issue was fixed in version 2022.1.5. You can find the changelog here: CHANGELOG.md

@debonte debonte closed this as completed Feb 4, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working fixed in next version (main) A fix has been implemented and will appear in an upcoming version
Projects
None yet
Development

No branches or pull requests

4 participants