tesla-fleet-api 0.8.0__py3-none-any.whl → 0.8.2__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- tesla_fleet_api/__init__.py +2 -0
- tesla_fleet_api/const.py +1 -1
- tesla_fleet_api/teslafleetapi.py +13 -14
- tesla_fleet_api/vehiclesigned.py +5 -8
- {tesla_fleet_api-0.8.0.dist-info → tesla_fleet_api-0.8.2.dist-info}/METADATA +1 -1
- {tesla_fleet_api-0.8.0.dist-info → tesla_fleet_api-0.8.2.dist-info}/RECORD +9 -9
- {tesla_fleet_api-0.8.0.dist-info → tesla_fleet_api-0.8.2.dist-info}/LICENSE +0 -0
- {tesla_fleet_api-0.8.0.dist-info → tesla_fleet_api-0.8.2.dist-info}/WHEEL +0 -0
- {tesla_fleet_api-0.8.0.dist-info → tesla_fleet_api-0.8.2.dist-info}/top_level.txt +0 -0
tesla_fleet_api/__init__.py
CHANGED
@@ -10,6 +10,7 @@ from .partner import Partner
|
|
10
10
|
from .user import User
|
11
11
|
from .vehicle import Vehicle
|
12
12
|
from .vehiclespecific import VehicleSpecific
|
13
|
+
from .vehiclesigned import VehicleSigned
|
13
14
|
|
14
15
|
|
15
16
|
__all__ = [
|
@@ -25,4 +26,5 @@ __all__ = [
|
|
25
26
|
"User",
|
26
27
|
"Vehicle",
|
27
28
|
"VehicleSpecific",
|
29
|
+
"VehicleSigned",
|
28
30
|
]
|
tesla_fleet_api/const.py
CHANGED
tesla_fleet_api/teslafleetapi.py
CHANGED
@@ -4,11 +4,11 @@ from json import dumps
|
|
4
4
|
from typing import Any, Awaitable
|
5
5
|
from os.path import exists
|
6
6
|
import aiohttp
|
7
|
+
import aiofiles
|
7
8
|
|
8
9
|
# cryptography
|
9
|
-
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
|
10
10
|
from cryptography.hazmat.primitives.asymmetric import ec
|
11
|
-
from cryptography.hazmat.primitives import
|
11
|
+
from cryptography.hazmat.primitives import serialization
|
12
12
|
from cryptography.hazmat.backends import default_backend
|
13
13
|
|
14
14
|
from .exceptions import raise_for_status, InvalidRegion, LibraryError, ResponseError
|
@@ -30,7 +30,7 @@ class TeslaFleetApi:
|
|
30
30
|
session: aiohttp.ClientSession
|
31
31
|
headers: dict[str, str]
|
32
32
|
refresh_hook: Awaitable | None = None
|
33
|
-
_private_key: ec.EllipticCurvePrivateKey
|
33
|
+
_private_key: ec.EllipticCurvePrivateKey | None = None
|
34
34
|
|
35
35
|
def __init__(
|
36
36
|
self,
|
@@ -161,8 +161,8 @@ class TeslaFleetApi:
|
|
161
161
|
"api/1/products",
|
162
162
|
)
|
163
163
|
|
164
|
-
def
|
165
|
-
"""
|
164
|
+
async def get_private_key(self, path: str = "private_key.pem") -> ec.EllipticCurvePrivateKey:
|
165
|
+
"""Get or create the private key."""
|
166
166
|
if not exists(path):
|
167
167
|
self._private_key = ec.generate_private_key(
|
168
168
|
ec.SECP256R1(), default_backend()
|
@@ -173,16 +173,15 @@ class TeslaFleetApi:
|
|
173
173
|
format=serialization.PrivateFormat.TraditionalOpenSSL,
|
174
174
|
encryption_algorithm=serialization.NoEncryption(),
|
175
175
|
)
|
176
|
-
with open(path, "wb") as key_file:
|
177
|
-
key_file.write(pem)
|
178
|
-
return self._private_key
|
176
|
+
async with aiofiles.open(path, "wb") as key_file:
|
177
|
+
await key_file.write(pem)
|
179
178
|
else:
|
180
179
|
try:
|
181
|
-
with open(path, "rb") as key_file:
|
182
|
-
key_data = key_file.read()
|
183
|
-
|
184
|
-
|
185
|
-
|
180
|
+
async with aiofiles.open(path, "rb") as key_file:
|
181
|
+
key_data = await key_file.read()
|
182
|
+
value = serialization.load_pem_private_key(
|
183
|
+
key_data, password=None, backend=default_backend()
|
184
|
+
)
|
186
185
|
except FileNotFoundError:
|
187
186
|
raise FileNotFoundError(f"Private key file not found at {path}")
|
188
187
|
except PermissionError:
|
@@ -191,4 +190,4 @@ class TeslaFleetApi:
|
|
191
190
|
if not isinstance(value, ec.EllipticCurvePrivateKey):
|
192
191
|
raise AssertionError("Loaded key is not an EllipticCurvePrivateKey")
|
193
192
|
self._private_key = value
|
194
|
-
|
193
|
+
return self._private_key
|
tesla_fleet_api/vehiclesigned.py
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
import base64
|
3
|
-
from dataclasses import dataclass
|
4
3
|
from random import randbytes
|
5
4
|
from typing import Any, TYPE_CHECKING
|
6
5
|
import time
|
@@ -155,7 +154,7 @@ class Session:
|
|
155
154
|
class VehicleSigned(VehicleSpecific):
|
156
155
|
"""Class describing the Tesla Fleet API vehicle endpoints and commands for a specific vehicle with command signing."""
|
157
156
|
|
158
|
-
|
157
|
+
_private_key: ec.EllipticCurvePrivateKey
|
159
158
|
_public_key: bytes
|
160
159
|
_from_destination: bytes
|
161
160
|
_sessions: dict[int, Session]
|
@@ -165,13 +164,13 @@ class VehicleSigned(VehicleSpecific):
|
|
165
164
|
):
|
166
165
|
super().__init__(parent, vin)
|
167
166
|
if key:
|
168
|
-
self.
|
167
|
+
self._private_key = key
|
169
168
|
elif parent._parent._private_key:
|
170
|
-
self.
|
169
|
+
self._private_key = parent._parent._private_key
|
171
170
|
else:
|
172
171
|
raise ValueError("No private key.")
|
173
172
|
|
174
|
-
self._public_key = self.
|
173
|
+
self._public_key = self._private_key.public_key().public_bytes(
|
175
174
|
encoding=Encoding.X962, format=PublicFormat.UncompressedPoint
|
176
175
|
)
|
177
176
|
self._from_destination = randbytes(16)
|
@@ -201,7 +200,7 @@ class VehicleSigned(VehicleSpecific):
|
|
201
200
|
vehicle_public_key = info.publicKey
|
202
201
|
|
203
202
|
# Derive shared key from private key _key and vehicle public key
|
204
|
-
shared = self.
|
203
|
+
shared = self._private_key.exchange(
|
205
204
|
ec.ECDH(),
|
206
205
|
ec.EllipticCurvePublicKey.from_encoded_point(
|
207
206
|
ec.SECP256R1(), vehicle_public_key
|
@@ -215,8 +214,6 @@ class VehicleSigned(VehicleSpecific):
|
|
215
214
|
delta=int(time.time()) - info.clock_time,
|
216
215
|
)
|
217
216
|
|
218
|
-
print(self._sessions[domain])
|
219
|
-
|
220
217
|
async def _sendVehicleSecurity(self, command: UnsignedMessage) -> dict[str, Any]:
|
221
218
|
"""Sign and send a message to Infotainment computer."""
|
222
219
|
if DOMAIN_VEHICLE_SECURITY not in self._sessions:
|
@@ -1,19 +1,19 @@
|
|
1
|
-
tesla_fleet_api/__init__.py,sha256=
|
1
|
+
tesla_fleet_api/__init__.py,sha256=BVZUDsfaxT05tAfcMHHWiyFyXwmDOx_wP_IHZBscgho,729
|
2
2
|
tesla_fleet_api/charging.py,sha256=N_mc8axrXj3iduqLj_jCt4Vx86tHqe3xqQT4R1R7HvU,1689
|
3
|
-
tesla_fleet_api/const.py,sha256=
|
3
|
+
tesla_fleet_api/const.py,sha256=UqD-Vof5Dv7VkJZ7Qe4DgwVYlhiEBzM1V-Qzxde_6Aw,9577
|
4
4
|
tesla_fleet_api/energy.py,sha256=S7D75MPuMVsHgkyUcFfMqjGCLZBM5YVFlWLEHbaX-zw,5957
|
5
5
|
tesla_fleet_api/energyspecific.py,sha256=UfeaGE59aoAa8UhpQCXUi0sOrNCA40xZlqwF73BXTVY,4254
|
6
6
|
tesla_fleet_api/exceptions.py,sha256=zl8m4Z51ihVD5cKYSZ8e6heerArF0j5isQmX-gSdkwM,15456
|
7
7
|
tesla_fleet_api/partner.py,sha256=1vIBUaxKLIfqcC0X6VXZN0dMAzj_CLNPUMjA6QVqZ1k,1223
|
8
8
|
tesla_fleet_api/ratecalculator.py,sha256=4lz8yruUeouHXh_3ezsXX-CTpIegp1T1J4VuRV_qdHA,1791
|
9
|
-
tesla_fleet_api/teslafleetapi.py,sha256=
|
9
|
+
tesla_fleet_api/teslafleetapi.py,sha256=zEu47xLopPfkpqE5nx2rf9eqZuZFii1jjXsOgay6Q3A,7229
|
10
10
|
tesla_fleet_api/teslafleetoauth.py,sha256=OY9yRQuokYo3ts0C8Qb6Z-o9NNAGHbX9F5mHfAh50fo,4121
|
11
11
|
tesla_fleet_api/teslafleetopensource.py,sha256=TJfVPcqJlA1b3kMoGuLr-g5Gn8UDyYsTZhjvGY1MtIk,2007
|
12
12
|
tesla_fleet_api/teslemetry.py,sha256=Rl73BWYYJk1UWIhCPwywcXGRlkATYZrPz3LP-Covppw,3272
|
13
13
|
tesla_fleet_api/tessie.py,sha256=4dBYxe1G2v9JvJGRbb01wXrAmvWT4jOfV4f_VQE_vkE,2302
|
14
14
|
tesla_fleet_api/user.py,sha256=TZE2oh-n5zrhKXmGRuiNL9voKVODD7rBhGE_IObYVGA,1179
|
15
15
|
tesla_fleet_api/vehicle.py,sha256=W5Y_ok5PK7jtXsenWpMWJTS4RpLhRW-1AlTPv1a6R6A,31765
|
16
|
-
tesla_fleet_api/vehiclesigned.py,sha256=
|
16
|
+
tesla_fleet_api/vehiclesigned.py,sha256=vQ5luKjfpFAjnLBpJhOrUfdDDa24AEwKLRrf82bRQWs,39167
|
17
17
|
tesla_fleet_api/vehiclespecific.py,sha256=Nr4zZzfmIuw3RFYjQEX6c_xtYZgztMsN5ohVn-YEH0I,20600
|
18
18
|
tesla_fleet_api/pb2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
19
19
|
tesla_fleet_api/pb2/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -25,8 +25,8 @@ tesla_fleet_api/pb2/signatures_pb2.py,sha256=5mdJUC8EC8kx1UxYrHK5XI3_7M6v7w2POH1
|
|
25
25
|
tesla_fleet_api/pb2/universal_message_pb2.py,sha256=F6-SkYXSuzWDsBvnGMg9k2pAIZv13v609qCPx7NSrdw,7254
|
26
26
|
tesla_fleet_api/pb2/vcsec_pb2.py,sha256=CMJ97e4Mm4p7NFcgybbCC2KJRcvtrcqmBy_pGycYhMo,26238
|
27
27
|
tesla_fleet_api/pb2/vehicle_pb2.py,sha256=P1V7Dqg3BBGZwODxTpZqtxLP6fGS_FNBqJcz_Fp0crs,2482
|
28
|
-
tesla_fleet_api-0.8.
|
29
|
-
tesla_fleet_api-0.8.
|
30
|
-
tesla_fleet_api-0.8.
|
31
|
-
tesla_fleet_api-0.8.
|
32
|
-
tesla_fleet_api-0.8.
|
28
|
+
tesla_fleet_api-0.8.2.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
29
|
+
tesla_fleet_api-0.8.2.dist-info/METADATA,sha256=sNmh6uj5rzAIUbXzR5hoLenHTKsNy-xXgrMRwcrUmbc,3821
|
30
|
+
tesla_fleet_api-0.8.2.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
|
31
|
+
tesla_fleet_api-0.8.2.dist-info/top_level.txt,sha256=jeNbog_1saXBFrGpom9WyPWmilxsyP3szL_G7JLWQfM,16
|
32
|
+
tesla_fleet_api-0.8.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|