aboutsummaryrefslogtreecommitdiff
path: root/pyecsca/ec/naf.py
diff options
context:
space:
mode:
Diffstat (limited to 'pyecsca/ec/naf.py')
-rw-r--r--pyecsca/ec/naf.py30
1 files changed, 30 insertions, 0 deletions
diff --git a/pyecsca/ec/naf.py b/pyecsca/ec/naf.py
new file mode 100644
index 0000000..855ffd1
--- /dev/null
+++ b/pyecsca/ec/naf.py
@@ -0,0 +1,30 @@
+from public import public
+from typing import List
+
+
+@public
+def wnaf(k: int, w: int) -> List[int]:
+ half_width = 2 ** (w - 1)
+ full_width = half_width * 2
+
+ def mods(val: int):
+ val_mod = val % full_width
+ if val_mod > half_width:
+ val_mod -= full_width
+ return val_mod
+
+ result = []
+ while k >= 1:
+ if k & 1:
+ k_val = mods(k)
+ result.insert(0, k_val)
+ k -= k_val
+ else:
+ result.insert(0, 0)
+ k >>= 1
+ return result
+
+
+@public
+def naf(k: int) -> List[int]:
+ return wnaf(k, 2)