computational hardness assumptions