I am reading the Lightning Network paper and noticed that when describing bidirectional payment channels, the authors used "Breach Remedy transactions" and the exchange of the two parties' private keys to discourage any of the parties to broadcast an old commitment transaction. This is indeed an effective solution, however I read in more than one place (e.g. here, here) that this is actually achieved through hashlocks (i.e. the two parties create hashlocked transactions from their commitment transactions and share the hashlock secret instead of exchanging their private keys to discourage the broadcasting of previous commitment transactions when they update the channel). In the paper, hashlocks are used when the bidirectional payment channels are used to relay payments among more than two nodes, however they are not used for payment channels between two nodes.
So the question is: are commitment transactions between two nodes revoked through hashlocks or through private keys exchange?