Exemplo n.º 1
0
    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}")
Exemplo n.º 2
0
    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)}")