Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F122860721
skinny_round.c
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Tue, Jul 22, 13:55
Size
11 KB
Mime Type
text/x-c
Expires
Thu, Jul 24, 13:55 (2 d)
Engine
blob
Format
Raw Data
Handle
27581648
Attached To
R10499 Energy Analysis of Lightweight AEAD Circuit
skinny_round.c
View Options
/*
* Date: January 2019
* Contact: Toon Purnal
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "skinny_round.h"
#include "helpers.h"
//#define DEBUG_SKINNY
/* === Print intermediate results for debugging purposes === */
void
print_cells
(
unsigned
char
s
[
4
][
4
],
int
i
){
#ifdef DEBUG_SKINNY
int
j
,
k
;
printf
(
"
\n
%i: "
,
i
);
for
(
j
=
0
;
j
<
4
;
j
++
)
for
(
k
=
0
;
k
<
4
;
k
++
)
printf
(
"%02x "
,
s
[
j
][
k
]);
#endif
}
void
print_keycells
(
unsigned
char
s
[
3
][
4
][
4
],
int
i
){
#ifdef DEBUG_SKINNY
int
j
,
k
,
z
;
for
(
z
=
0
;
z
<
3
;
z
++
)
{
printf
(
"
\t
%i: "
,
i
);
for
(
j
=
0
;
j
<
4
;
j
++
)
for
(
k
=
0
;
k
<
4
;
k
++
)
printf
(
"%02x "
,
s
[
z
][
j
][
k
]);
}
#endif
}
// Packing of data is done as follows (state[i][j] stands for row i and column j):
// 0 1 2 3
// 4 5 6 7
// 8 9 10 11
//12 13 14 15
/* SBox */
#ifdef CRYPTO_BLOCKSIZE_8
const
unsigned
char
sbox
[
16
]
=
{
12
,
6
,
9
,
0
,
1
,
10
,
2
,
11
,
3
,
8
,
5
,
13
,
4
,
14
,
7
,
15
};
const
unsigned
char
sbox_inv
[
16
]
=
{
3
,
4
,
6
,
8
,
12
,
10
,
1
,
14
,
9
,
2
,
5
,
7
,
0
,
11
,
13
,
15
};
#endif
#ifdef CRYPTO_BLOCKSIZE_16
const
unsigned
char
sbox
[
256
]
=
{
0x65
,
0x4c
,
0x6a
,
0x42
,
0x4b
,
0x63
,
0x43
,
0x6b
,
0x55
,
0x75
,
0x5a
,
0x7a
,
0x53
,
0x73
,
0x5b
,
0x7b
,
0x35
,
0x8c
,
0x3a
,
0x81
,
0x89
,
0x33
,
0x80
,
0x3b
,
0x95
,
0x25
,
0x98
,
0x2a
,
0x90
,
0x23
,
0x99
,
0x2b
,
0xe5
,
0xcc
,
0xe8
,
0xc1
,
0xc9
,
0xe0
,
0xc0
,
0xe9
,
0xd5
,
0xf5
,
0xd8
,
0xf8
,
0xd0
,
0xf0
,
0xd9
,
0xf9
,
0xa5
,
0x1c
,
0xa8
,
0x12
,
0x1b
,
0xa0
,
0x13
,
0xa9
,
0x05
,
0xb5
,
0x0a
,
0xb8
,
0x03
,
0xb0
,
0x0b
,
0xb9
,
0x32
,
0x88
,
0x3c
,
0x85
,
0x8d
,
0x34
,
0x84
,
0x3d
,
0x91
,
0x22
,
0x9c
,
0x2c
,
0x94
,
0x24
,
0x9d
,
0x2d
,
0x62
,
0x4a
,
0x6c
,
0x45
,
0x4d
,
0x64
,
0x44
,
0x6d
,
0x52
,
0x72
,
0x5c
,
0x7c
,
0x54
,
0x74
,
0x5d
,
0x7d
,
0xa1
,
0x1a
,
0xac
,
0x15
,
0x1d
,
0xa4
,
0x14
,
0xad
,
0x02
,
0xb1
,
0x0c
,
0xbc
,
0x04
,
0xb4
,
0x0d
,
0xbd
,
0xe1
,
0xc8
,
0xec
,
0xc5
,
0xcd
,
0xe4
,
0xc4
,
0xed
,
0xd1
,
0xf1
,
0xdc
,
0xfc
,
0xd4
,
0xf4
,
0xdd
,
0xfd
,
0x36
,
0x8e
,
0x38
,
0x82
,
0x8b
,
0x30
,
0x83
,
0x39
,
0x96
,
0x26
,
0x9a
,
0x28
,
0x93
,
0x20
,
0x9b
,
0x29
,
0x66
,
0x4e
,
0x68
,
0x41
,
0x49
,
0x60
,
0x40
,
0x69
,
0x56
,
0x76
,
0x58
,
0x78
,
0x50
,
0x70
,
0x59
,
0x79
,
0xa6
,
0x1e
,
0xaa
,
0x11
,
0x19
,
0xa3
,
0x10
,
0xab
,
0x06
,
0xb6
,
0x08
,
0xba
,
0x00
,
0xb3
,
0x09
,
0xbb
,
0xe6
,
0xce
,
0xea
,
0xc2
,
0xcb
,
0xe3
,
0xc3
,
0xeb
,
0xd6
,
0xf6
,
0xda
,
0xfa
,
0xd3
,
0xf3
,
0xdb
,
0xfb
,
0x31
,
0x8a
,
0x3e
,
0x86
,
0x8f
,
0x37
,
0x87
,
0x3f
,
0x92
,
0x21
,
0x9e
,
0x2e
,
0x97
,
0x27
,
0x9f
,
0x2f
,
0x61
,
0x48
,
0x6e
,
0x46
,
0x4f
,
0x67
,
0x47
,
0x6f
,
0x51
,
0x71
,
0x5e
,
0x7e
,
0x57
,
0x77
,
0x5f
,
0x7f
,
0xa2
,
0x18
,
0xae
,
0x16
,
0x1f
,
0xa7
,
0x17
,
0xaf
,
0x01
,
0xb2
,
0x0e
,
0xbe
,
0x07
,
0xb7
,
0x0f
,
0xbf
,
0xe2
,
0xca
,
0xee
,
0xc6
,
0xcf
,
0xe7
,
0xc7
,
0xef
,
0xd2
,
0xf2
,
0xde
,
0xfe
,
0xd7
,
0xf7
,
0xdf
,
0xff
};
const
unsigned
char
sbox_inv
[
256
]
=
{
0xac
,
0xe8
,
0x68
,
0x3c
,
0x6c
,
0x38
,
0xa8
,
0xec
,
0xaa
,
0xae
,
0x3a
,
0x3e
,
0x6a
,
0x6e
,
0xea
,
0xee
,
0xa6
,
0xa3
,
0x33
,
0x36
,
0x66
,
0x63
,
0xe3
,
0xe6
,
0xe1
,
0xa4
,
0x61
,
0x34
,
0x31
,
0x64
,
0xa1
,
0xe4
,
0x8d
,
0xc9
,
0x49
,
0x1d
,
0x4d
,
0x19
,
0x89
,
0xcd
,
0x8b
,
0x8f
,
0x1b
,
0x1f
,
0x4b
,
0x4f
,
0xcb
,
0xcf
,
0x85
,
0xc0
,
0x40
,
0x15
,
0x45
,
0x10
,
0x80
,
0xc5
,
0x82
,
0x87
,
0x12
,
0x17
,
0x42
,
0x47
,
0xc2
,
0xc7
,
0x96
,
0x93
,
0x03
,
0x06
,
0x56
,
0x53
,
0xd3
,
0xd6
,
0xd1
,
0x94
,
0x51
,
0x04
,
0x01
,
0x54
,
0x91
,
0xd4
,
0x9c
,
0xd8
,
0x58
,
0x0c
,
0x5c
,
0x08
,
0x98
,
0xdc
,
0x9a
,
0x9e
,
0x0a
,
0x0e
,
0x5a
,
0x5e
,
0xda
,
0xde
,
0x95
,
0xd0
,
0x50
,
0x05
,
0x55
,
0x00
,
0x90
,
0xd5
,
0x92
,
0x97
,
0x02
,
0x07
,
0x52
,
0x57
,
0xd2
,
0xd7
,
0x9d
,
0xd9
,
0x59
,
0x0d
,
0x5d
,
0x09
,
0x99
,
0xdd
,
0x9b
,
0x9f
,
0x0b
,
0x0f
,
0x5b
,
0x5f
,
0xdb
,
0xdf
,
0x16
,
0x13
,
0x83
,
0x86
,
0x46
,
0x43
,
0xc3
,
0xc6
,
0x41
,
0x14
,
0xc1
,
0x84
,
0x11
,
0x44
,
0x81
,
0xc4
,
0x1c
,
0x48
,
0xc8
,
0x8c
,
0x4c
,
0x18
,
0x88
,
0xcc
,
0x1a
,
0x1e
,
0x8a
,
0x8e
,
0x4a
,
0x4e
,
0xca
,
0xce
,
0x35
,
0x60
,
0xe0
,
0xa5
,
0x65
,
0x30
,
0xa0
,
0xe5
,
0x32
,
0x37
,
0xa2
,
0xa7
,
0x62
,
0x67
,
0xe2
,
0xe7
,
0x3d
,
0x69
,
0xe9
,
0xad
,
0x6d
,
0x39
,
0xa9
,
0xed
,
0x3b
,
0x3f
,
0xab
,
0xaf
,
0x6b
,
0x6f
,
0xeb
,
0xef
,
0x26
,
0x23
,
0xb3
,
0xb6
,
0x76
,
0x73
,
0xf3
,
0xf6
,
0x71
,
0x24
,
0xf1
,
0xb4
,
0x21
,
0x74
,
0xb1
,
0xf4
,
0x2c
,
0x78
,
0xf8
,
0xbc
,
0x7c
,
0x28
,
0xb8
,
0xfc
,
0x2a
,
0x2e
,
0xba
,
0xbe
,
0x7a
,
0x7e
,
0xfa
,
0xfe
,
0x25
,
0x70
,
0xf0
,
0xb5
,
0x75
,
0x20
,
0xb0
,
0xf5
,
0x22
,
0x27
,
0xb2
,
0xb7
,
0x72
,
0x77
,
0xf2
,
0xf7
,
0x2d
,
0x79
,
0xf9
,
0xbd
,
0x7d
,
0x29
,
0xb9
,
0xfd
,
0x2b
,
0x2f
,
0xbb
,
0xbf
,
0x7b
,
0x7f
,
0xfb
,
0xff
};
#endif
/* ShiftRows and TweakeySchedule permutations */
const
unsigned
char
P
[
16
]
=
{
0
,
1
,
2
,
3
,
7
,
4
,
5
,
6
,
10
,
11
,
8
,
9
,
13
,
14
,
15
,
12
};
const
unsigned
char
TWEAKEY_P
[
16
]
=
{
9
,
15
,
8
,
13
,
10
,
14
,
12
,
11
,
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
};
/* 7-bit round constant */
const
unsigned
char
RC
[
87
]
=
{
0x01
,
0x03
,
0x07
,
0x0f
,
0x1f
,
0x3f
,
0x7e
,
0x7d
,
0x7b
,
0x77
,
0x6f
,
0x5f
,
0x3e
,
0x7c
,
0x79
,
0x73
,
0x67
,
0x4f
,
0x1e
,
0x3d
,
0x7a
,
0x75
,
0x6b
,
0x57
,
0x2e
,
0x5c
,
0x38
,
0x70
,
0x61
,
0x43
,
0x06
,
0x0d
,
0x1b
,
0x37
,
0x6e
,
0x5d
,
0x3a
,
0x74
,
0x69
,
0x53
,
0x26
,
0x4c
,
0x18
,
0x31
,
0x62
,
0x45
,
0x0a
,
0x15
,
0x2b
,
0x56
,
0x2c
,
0x58
,
0x30
,
0x60
,
0x41
,
0x02
,
0x05
,
0x0b
,
0x17
,
0x2f
,
0x5e
,
0x3c
,
0x78
,
0x71
,
0x63
,
0x47
,
0x0e
,
0x1d
,
0x3b
,
0x76
,
0x6d
,
0x5b
,
0x36
,
0x6c
,
0x59
,
0x32
,
0x64
,
0x49
,
0x12
,
0x25
,
0x4a
,
0x14
,
0x29
,
0x52
,
0x24
,
0x48
,
0x10
};
void
AddConstants
(
unsigned
char
state
[
4
][
4
],
int
i
){
state
[
0
][
0
]
^=
(
RC
[
i
]
&
0xf
);
// 4-3-2-1
state
[
1
][
0
]
^=
((
RC
[
i
]
>>
4
)
&
0x7
);
// 7-6-5
state
[
2
][
0
]
^=
0x2
;
/* Indicate tweak material */
state
[
0
][
2
]
^=
0x2
;
}
void
SubCell
(
unsigned
char
state
[
4
][
4
]){
int
i
,
j
;
for
(
i
=
0
;
i
<
4
;
i
++
)
for
(
j
=
0
;
j
<
4
;
j
++
)
state
[
i
][
j
]
=
sbox
[
state
[
i
][
j
]];
}
void
SubCell_inv
(
unsigned
char
state
[
4
][
4
]){
int
i
,
j
;
for
(
i
=
0
;
i
<
4
;
i
++
)
for
(
j
=
0
;
j
<
4
;
j
++
)
state
[
i
][
j
]
=
sbox_inv
[
state
[
i
][
j
]];
}
void
ShiftRows
(
unsigned
char
state
[
4
][
4
]){
int
i
,
j
,
pos
;
unsigned
char
state_tmp
[
4
][
4
];
for
(
i
=
0
;
i
<
4
;
i
++
)
for
(
j
=
0
;
j
<
4
;
j
++
){
pos
=
P
[
j
+
4
*
i
];
state_tmp
[
i
][
j
]
=
state
[
pos
>>
2
][
pos
&
0x3
];
}
stateCopy
(
state
,
state_tmp
);
}
void
ShiftRows_inv
(
unsigned
char
state
[
4
][
4
]){
int
i
,
j
,
pos
;
unsigned
char
state_tmp
[
4
][
4
];
for
(
i
=
0
;
i
<
4
;
i
++
)
for
(
j
=
0
;
j
<
4
;
j
++
){
pos
=
P
[
j
+
4
*
i
];
state_tmp
[
pos
>>
2
][
pos
&
0x3
]
=
state
[
i
][
j
];
}
stateCopy
(
state
,
state_tmp
);
}
void
MixColumn
(
unsigned
char
state
[
4
][
4
]){
int
j
;
unsigned
char
temp
;
for
(
j
=
0
;
j
<
4
;
j
++
){
state
[
1
][
j
]
^=
state
[
2
][
j
];
state
[
2
][
j
]
^=
state
[
0
][
j
];
state
[
3
][
j
]
^=
state
[
2
][
j
];
temp
=
state
[
3
][
j
];
state
[
3
][
j
]
=
state
[
2
][
j
];
state
[
2
][
j
]
=
state
[
1
][
j
];
state
[
1
][
j
]
=
state
[
0
][
j
];
state
[
0
][
j
]
=
temp
;
}
}
void
MixColumn_inv
(
unsigned
char
state
[
4
][
4
]){
int
j
;
unsigned
char
temp
;
for
(
j
=
0
;
j
<
4
;
j
++
){
temp
=
state
[
3
][
j
];
state
[
3
][
j
]
=
state
[
0
][
j
];
state
[
0
][
j
]
=
state
[
1
][
j
];
state
[
1
][
j
]
=
state
[
2
][
j
];
state
[
2
][
j
]
=
temp
;
state
[
3
][
j
]
^=
state
[
2
][
j
];
state
[
2
][
j
]
^=
state
[
0
][
j
];
state
[
1
][
j
]
^=
state
[
2
][
j
];
}
}
/* ADVANCE THE KEY SCHEDULE ONCE */
void
advanceKeySchedule
(
unsigned
char
keyCells
[
TWEAKEY_BLOCKSIZE_RATIO
][
4
][
4
])
{
/* Declarations */
int
i
,
j
,
k
;
unsigned
char
pos
;
unsigned
char
keyCells_tmp
[
TWEAKEY_BLOCKSIZE_RATIO
][
4
][
4
];
// update the subtweakey states with the permutation
for
(
k
=
0
;
k
<
TWEAKEY_BLOCKSIZE_RATIO
;
k
++
){
for
(
i
=
0
;
i
<
4
;
i
++
){
for
(
j
=
0
;
j
<
4
;
j
++
){
pos
=
TWEAKEY_P
[
j
+
4
*
i
];
keyCells_tmp
[
k
][
i
][
j
]
=
keyCells
[
k
][
pos
>>
2
][
pos
&
0x3
];
}
}
}
// update the subtweakey states with the LFSRs
for
(
k
=
1
;
k
<
TWEAKEY_BLOCKSIZE_RATIO
;
k
++
)
for
(
i
=
0
;
i
<
2
;
i
++
)
// LFSR only on upper two rows
for
(
j
=
0
;
j
<
4
;
j
++
){
if
(
k
==
1
){
// TK2
#ifdef CRYPTO_BLOCKSIZE_8
keyCells_tmp
[
k
][
i
][
j
]
=
((
keyCells_tmp
[
k
][
i
][
j
]
<<
1
)
&
0xE
)
^
((
keyCells_tmp
[
k
][
i
][
j
]
>>
3
)
&
0x1
)
^
((
keyCells_tmp
[
k
][
i
][
j
]
>>
2
)
&
0x1
);
#else
keyCells_tmp
[
k
][
i
][
j
]
=
((
keyCells_tmp
[
k
][
i
][
j
]
<<
1
)
&
0xFE
)
^
((
keyCells_tmp
[
k
][
i
][
j
]
>>
7
)
&
0x01
)
^
((
keyCells_tmp
[
k
][
i
][
j
]
>>
5
)
&
0x01
);
#endif
}
else
if
(
k
==
2
){
// TK3
#ifdef CRYPTO_BLOCKSIZE_8
keyCells_tmp
[
k
][
i
][
j
]
=
((
keyCells_tmp
[
k
][
i
][
j
]
>>
1
)
&
0x7
)
^
((
keyCells_tmp
[
k
][
i
][
j
])
&
0x8
)
^
((
keyCells_tmp
[
k
][
i
][
j
]
<<
3
)
&
0x8
);
#else
keyCells_tmp
[
k
][
i
][
j
]
=
((
keyCells_tmp
[
k
][
i
][
j
]
>>
1
)
&
0x7F
)
^
((
keyCells_tmp
[
k
][
i
][
j
]
<<
7
)
&
0x80
)
^
((
keyCells_tmp
[
k
][
i
][
j
]
<<
1
)
&
0x80
);
#endif
}
}
tweakeyCopy
(
keyCells
,
keyCells_tmp
);
}
/* REVERSE THE KEY SCHEDULE ONCE (used in decryption and reconstruction) */
void
reverseKeySchedule
(
unsigned
char
keyCells
[
TWEAKEY_BLOCKSIZE_RATIO
][
4
][
4
]){
unsigned
char
keyCells_tmp
[
TWEAKEY_BLOCKSIZE_RATIO
][
4
][
4
];
int
i
,
j
,
k
;
unsigned
char
pos
;
// update the subtweakey states with the permutation
for
(
k
=
0
;
k
<
TWEAKEY_BLOCKSIZE_RATIO
;
k
++
)
for
(
i
=
0
;
i
<
4
;
i
++
)
for
(
j
=
0
;
j
<
4
;
j
++
){
// application of the inverse TWEAKEY permutation
pos
=
TWEAKEY_P
[
j
+
4
*
i
];
keyCells_tmp
[
k
][
pos
>>
2
][
pos
&
0x3
]
=
keyCells
[
k
][
i
][
j
];
}
// update the subtweakey states with the LFSRs
for
(
k
=
1
;
k
<
TWEAKEY_BLOCKSIZE_RATIO
;
k
++
)
for
(
i
=
2
;
i
<
4
;
i
++
)
for
(
j
=
0
;
j
<
4
;
j
++
){
if
(
k
==
1
){
#ifdef CRYPTO_BLOCKSIZE_8
if
(
CRYPTO_BLOCKSIZE
==
8
)
keyCells_tmp
[
k
][
i
][
j
]
=
((
keyCells_tmp
[
k
][
i
][
j
]
>>
1
)
&
0x7
)
^
((
keyCells_tmp
[
k
][
i
][
j
]
<<
3
)
&
0x8
)
^
((
keyCells_tmp
[
k
][
i
][
j
])
&
0x8
);
#else
keyCells_tmp
[
k
][
i
][
j
]
=
((
keyCells_tmp
[
k
][
i
][
j
]
>>
1
)
&
0x7F
)
^
((
keyCells_tmp
[
k
][
i
][
j
]
<<
7
)
&
0x80
)
^
((
keyCells_tmp
[
k
][
i
][
j
]
<<
1
)
&
0x80
);
#endif
}
else
if
(
k
==
2
){
#ifdef CRYPTO_BLOCKSIZE_8
keyCells_tmp
[
k
][
i
][
j
]
=
((
keyCells_tmp
[
k
][
i
][
j
]
<<
1
)
&
0xE
)
^
((
keyCells_tmp
[
k
][
i
][
j
]
>>
3
)
&
0x1
)
^
((
keyCells_tmp
[
k
][
i
][
j
]
>>
2
)
&
0x1
);
#else
keyCells_tmp
[
k
][
i
][
j
]
=
((
keyCells_tmp
[
k
][
i
][
j
]
<<
1
)
&
0xFE
)
^
((
keyCells_tmp
[
k
][
i
][
j
]
>>
7
)
&
0x01
)
^
((
keyCells_tmp
[
k
][
i
][
j
]
>>
5
)
&
0x01
);
#endif
}
}
tweakeyCopy
(
keyCells
,
keyCells_tmp
);
}
// Extract and apply the subtweakey to the internal state (must be the two top rows XORed together), then update the tweakey state
void
AddKey
(
unsigned
char
state
[
4
][
4
],
unsigned
char
keyCells
[
TWEAKEY_BLOCKSIZE_RATIO
][
4
][
4
]){
int
i
,
j
,
k
;
for
(
k
=
0
;
k
<
TWEAKEY_BLOCKSIZE_RATIO
;
k
++
)
for
(
i
=
0
;
i
<
2
;
i
++
)
// Row i (two rows only)
for
(
j
=
0
;
j
<
4
;
j
++
)
// Cell j in row i
state
[
i
][
j
]
^=
keyCells
[
k
][
i
][
j
];
advanceKeySchedule
(
keyCells
);
}
// Extract and apply the subtweakey to the internal state (must be the two top rows XORed together), then update the tweakey state (inverse function}
void
AddKey_inv
(
unsigned
char
state
[
4
][
4
],
unsigned
char
keyCells
[
TWEAKEY_BLOCKSIZE_RATIO
][
4
][
4
]){
int
i
,
j
,
k
;
reverseKeySchedule
(
keyCells
);
for
(
k
=
0
;
k
<
TWEAKEY_BLOCKSIZE_RATIO
;
k
++
)
// For every TKi
for
(
i
=
0
;
i
<
2
;
i
++
)
// Row i (two rows only)
for
(
j
=
0
;
j
<
4
;
j
++
)
// Cell j in row i
state
[
i
][
j
]
^=
keyCells
[
k
][
i
][
j
];
}
void
skinny_round
(
unsigned
char
state
[
4
][
4
],
unsigned
char
keyCells
[
TWEAKEY_BLOCKSIZE_RATIO
][
4
][
4
],
int
i
){
//printf("\nroundkey");
//print_keycells(keyCells, i);
//printf("\ninput");
print_cells
(
state
,
i
+
1
);
SubCell
(
state
);
//printf("\nsubstitute");
print_cells
(
state
,
i
+
1
);
AddConstants
(
state
,
i
);
//printf("\naddition");
//print_cells(state, i);
AddKey
(
state
,
keyCells
);
print_cells
(
state
,
i
+
1
);
ShiftRows
(
state
);
MixColumn
(
state
);
//printf("\nstate_next");
print_cells
(
state
,
i
+
1
);
//printf("\n");
}
void
skinny_round_inv
(
unsigned
char
state
[
4
][
4
],
unsigned
char
keyCells
[
TWEAKEY_BLOCKSIZE_RATIO
][
4
][
4
],
int
i
){
MixColumn_inv
(
state
);
ShiftRows_inv
(
state
);
AddKey_inv
(
state
,
keyCells
);
AddConstants
(
state
,
i
);
SubCell_inv
(
state
);
print_cells
(
state
,
i
);
}
Event Timeline
Log In to Comment