Skip to content

Instantly share code, notes, and snippets.

@monacoremo
Forked from bwbroersma/totp.pg.sql
Created January 21, 2020 15:35
Show Gist options
  • Save monacoremo/cf4f5eb03dd62c4a7c5b88ce32bae7b5 to your computer and use it in GitHub Desktop.
Save monacoremo/cf4f5eb03dd62c4a7c5b88ce32bae7b5 to your computer and use it in GitHub Desktop.
CREATE EXTENSION pgcrypto;
CREATE OR REPLACE FUNCTION totp(key BYTEA, clock_offset INT DEFAULT 0) RETURNS INT AS $$
DECLARE
c BYTEA := '\x000000000' || TO_HEX(FLOOR(EXTRACT(EPOCH FROM NOW()) / 30)::INT + clock_offset);
mac BYTEA := HMAC(c, key, 'sha1');
trunc_offset INT := GET_BYTE(mac, 19) % 16;
result INT := SUBSTRING(SET_BIT(SUBSTRING(mac FROM 1 + trunc_offset FOR 4), 7, 0)::TEXT, 2)::BIT(32)::INT % 1000000;
BEGIN
RETURN result;
END;
$$ LANGUAGE plpgsql;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment