aboutsummarylogtreecommitdiffstats
path: root/step.h
diff options
context:
space:
mode:
authorLeonardo Gates2018-12-21 17:39:56 -0400
committerLeonardo Gates2019-06-11 17:42:09 +0000
commitf5cfcf8b760889880130934293025740e85aa70c (patch)
treecac7485b753b61cdb08cf847e8237e817353f166 /step.h
downloadaur-f5cfcf8b760889880130934293025740e85aa70c.tar.gz
Initial commit.
Diffstat (limited to 'step.h')
-rw-r--r--step.h121
1 files changed, 121 insertions, 0 deletions
diff --git a/step.h b/step.h
new file mode 100644
index 000000000000..db18795fd394
--- /dev/null
+++ b/step.h
@@ -0,0 +1,121 @@
+/**
+ * Performs a single step of the HAVEGE algorithm.
+ * Copyright (C) 2018 Leonardo Gates
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+{
+ flags = state->P1[ 0 ] >> 20;
+
+ HAVEGE_BRANCH_STRESS;
+
+ flags = flags >> 1;
+ state->P2[ 0 ] = ( state->P1[ 0 ] >> 18 ) & 7;
+
+ state->P1[ 0 ] = state->P1[ 0 ] & 0xfff;
+
+ HARDCLOCK( state->clock );
+
+ pt[ 0 ] = &state->walk_ptr[ state->P1[ 0 ] ^ 0];
+ pt[ 1 ] = &state->walk_ptr[ state->P1[ 1 ] ^ 0 ];
+ pt[ 2 ] = &state->walk_ptr[ state->P1[ 0 ] ^ 1 ];
+ pt[ 3 ] = &state->walk_ptr[ state->P1[ 1 ] ^ 4 ];
+
+ state->pool[ i + 0 ] ^= *pt[ 0 ];
+ state->pool[ i + 1 ] ^= *pt[ 1 ];
+ state->pool[ i + 2 ] ^= *pt[ 2 ];
+ state->pool[ i + 3 ] ^= *pt[ 3 ];
+
+ i += 4;
+
+ j = ( *pt[ 0 ] >> 1 ) ^ ( *pt[ 0 ] << 31 ) ^ state->clock;
+ *pt[ 0 ] = ( *pt[ 1 ] >> 2 ) ^ ( *pt[ 1 ] << 30 ) ^ state->clock;
+ *pt[ 1 ] = j;
+ *pt[ 2 ] = ( *pt[ 2 ] >> 3 ) ^ ( *pt[ 2 ] << 29 ) ^ state->clock;
+ *pt[ 3 ] = ( *pt[ 3 ] >> 4 ) ^ ( *pt[ 3 ] << 28 ) ^ state->clock;
+
+ pt[ 0 ] = &state->walk_ptr[ state->P1[ 0 ] ^ 2 ];
+ pt[ 1 ] = &state->walk_ptr[ state->P1[ 1 ] ^ 2 ];
+ pt[ 2 ] = &state->walk_ptr[ state->P1[ 0 ] ^ 3 ];
+ pt[ 3 ] = &state->walk_ptr[ state->P1[ 1 ] ^ 6 ];
+
+ state->pool[ i + 0 ] ^= *pt[ 0 ];
+ state->pool[ i + 1 ] ^= *pt[ 1 ];
+ state->pool[ i + 2 ] ^= *pt[ 2 ];
+ state->pool[ i + 3 ] ^= *pt[ 3 ];
+
+ i += 4;
+
+ if( flags & 1 ) {
+ tmp = pt[ 0 ];
+ pt[ 2 ] = pt[ 0 ];
+ pt[ 0 ] = tmp;
+ }
+
+ flags = ( state->P1[ 1 ] >> 18 );
+ j = ( *pt[ 0 ] >> 5 ) ^ ( *pt[ 0 ] << 27 ) ^ state->clock;
+ *pt[ 0 ] = (*pt[ 1 ] >> 6 ) ^ ( *pt[ 1 ] << 26 ) ^ state->clock;
+ *pt[ 1 ] = j;
+
+ HARDCLOCK( state->clock );
+
+ *pt[ 2 ] = ( *pt[ 2 ] >> 7 ) ^ ( *pt[ 2 ] << 25 ) ^ state->clock;
+ *pt[ 3 ] = ( *pt[ 3 ] >> 8 ) ^ ( *pt[ 3 ] << 24 ) ^ state->clock;
+
+ pt[ 0 ] = &state->walk_ptr[ state->P1[ 0 ] ^ 4 ];
+ pt[ 1 ] = &state->walk_ptr[ state->P1[ 1 ] ^ 1 ];
+
+ state->P1[ 1 ] = state->pool[( i - 8 ) ^ state->P2[ 1 ] ] ^ state->walk_ptr[ state->P1[ 1 ] ^ state->P2[ 1 ] ^ 7 ];
+ state->P1[ 1 ] = ( ( state->P1[ 1 ] & 0xfff ) & ( 0xfffffff7 ) ) ^ ( ( state->P1[ 0 ] ^ 8 ) & 8 );
+
+ state->P2[ 1 ] = ( ( state->P1[ 1 ] >> 28 ) & 7 );
+
+ HAVEGE_BRANCH_STRESS;
+
+ pt[ 2 ] = &state->walk_ptr[state->P1[ 0 ] ^ 5];
+ pt[ 3 ] = &state->walk_ptr[state->P1[ 1 ] ^ 5];
+
+ state->pool[ i + 0 ] ^= *pt[ 0 ];
+ state->pool[ i + 1 ] ^= *pt[ 1 ];
+ state->pool[ i + 2 ] ^= *pt[ 2 ];
+ state->pool[ i + 3 ] ^= *pt[ 3 ];
+
+ i += 4;
+
+ j = ( *pt[ 0 ] >> 9 ) ^ ( *pt[ 0 ] << 23 ) ^ state->clock;
+ *pt[ 0 ] = ( *pt[ 1 ] >> 10 ) ^ ( *pt[ 1 ] << 22 ) ^ state->clock;
+ *pt[ 1 ] = j;
+ *pt[ 2 ] = ( *pt[ 2 ] >> 11 ) ^ ( *pt[ 2 ] << 21 ) ^ state->clock;
+ *pt[ 3 ] = ( *pt[ 3 ] >> 12 ) ^ ( *pt[ 3 ] << 20 ) ^ state->clock;
+
+ pt[ 0 ] = &state->walk_ptr[ state->P1[ 0 ] ^ 6 ];
+ pt[ 1 ] = &state->walk_ptr[ state->P1[ 1 ] ^ 3 ];
+ pt[ 2 ] = &state->walk_ptr[ state->P1[ 0 ] ^ 7 ];
+ pt[ 3 ] = &state->walk_ptr[ state->P1[ 1 ] ^ 7 ];
+
+ state->pool[ i + 0 ] ^= *pt[ 0 ];
+ state->pool[ i + 1 ] ^= *pt[ 1 ];
+ state->pool[ i + 2 ] ^= *pt[ 2 ];
+ state->pool[ i + 3 ] ^= *pt[ 3 ];
+
+ i += 4;
+
+ j = ( *pt[ 0 ] >> 13 ) ^ ( *pt[ 0 ] << 19 ) ^ state->clock;
+ *pt[ 0 ] = ( *pt[ 1 ] >> 14 ) ^ ( *pt[ 1 ] << 18 ) ^ state->clock;
+ *pt[ 1 ] = j;
+ *pt[ 2 ] = ( *pt[ 2 ] >> 15 ) ^ ( *pt[ 2 ] << 17 ) ^ state->clock;
+ *pt[ 3 ] = ( *pt[ 3 ] >> 16 ) ^ ( *pt[ 3 ] << 16 ) ^ state->clock;
+ state->P1[ 0 ] = ( ( ( state->pool[ ( i - 8 ) ^ state->P2[ 0 ] ] ^ state->walk_ptr[ state->P1[ 0 ] ^ state->P2[ 0 ] ^ 7 ] ) ) & ( 0xffffffef ) ) ^ ( ( state->P1[ 1 ] ^ 0x10 ) & 0x10 );
+} \ No newline at end of file