# What is ge.h and what do its structs store?

As I am reading the Monero source code to understand it, I am not getting one thing, the confusion is caused due to `crypto-ops.c,ge.h,rctOps.cpp`.

Monero uses keccak hash that is 32 bytes in size, it uses (mod)q where size of q is 32 bytes, and it is the size of the group, so every point in the elliptic curve (x,y) is of (32,32) bytes.

Now my confusion is with `ge.h` where it has a struct that uses 40 bytes for storage. In one word, what do the structs in ge.h do?

New contributor
Hrt is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.

In one word, what do the structs in ge.h do?

Not in one word, but the structs defined in ge.h are used to store different representations of a group element (aka a point on an elliptic curve):

``````/*
ge means group element.
Here the group is the set of pairs (x,y) of field elements (see fe.h)
satisfying -x^2 + y^2 = 1 + d x^2y^2
where d = -121665/121666.
Representations:
ge_p2 (projective): (X:Y:Z) satisfying x=X/Z, y=Y/Z
ge_p3 (extended): (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT
ge_p1p1 (completed): ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T
ge_precomp (Duif): (y+x,y-x,2dxy)
*/
``````

source.

Monero uses keccak...

Which has nothing to do with elliptic curves (or by extension groups); keccak is a hash algorithm.