def decode_from_reader( self, reader: serialization.BinaryReader) -> EllipticCurve.ECPoint: """ Raises: NotImplementedError: if an unsupported point encoding is used TypeError: if unexpected encoding is read """ try: f = reader.read_byte() except ValueError: return self.Infinity f = int.from_bytes(f, "little") if f == 0: return self.Infinity # these are compressed if f == 2 or f == 3: yTilde = f & 1 data = bytearray(reader.read_bytes(32)) data.reverse() data.append(0) X1 = int.from_bytes(data, 'little') return self.decompress_from_curve(X1, yTilde) # uncompressed or hybrid elif f == 4 or f == 6 or f == 7: raise NotImplementedError() raise ValueError(f"Invalid point encoding: {f}")
def deserialize(self, reader: serialization.BinaryReader, curve=ECCCurve.SECP256R1) -> None: try: f0 = reader.read_byte() except ValueError: # infinity self.from_bytes(b'\x00', curve, True) return f1 = int.from_bytes(f0, 'little') if f1 == 0: # infinity self.from_bytes(b'\x00', curve, True) return elif f1 == 2 or f1 == 3: data = reader.read_bytes(32) self.from_bytes(f0 + data, curve, True) return else: raise ValueError(f"Unsupported point encoding: {str(f0)}")