byte HotStepper::nextStep(){ byte currentStep = unpad(((byte)*_port), _pinmask); switch(currentStep){ case B0000: case B0001: return (_dir == FORWARD ? B0010 : B1000); case B0010: return (_dir == FORWARD ? B0100 : B0001); case B0100: return (_dir == FORWARD ? B1000 : B0010); case B1000: return (_dir == FORWARD ? B0001 : B0100); } }
/* C = C + AB. */ void square_sgemm(int n, float *A, float *B, float *C) { const int npad = ((n + K_STRIDE - 1) / K_STRIDE) * K_STRIDE; float *Acpy = calloc(npad * npad, sizeof(float)); transpose(n, npad, A, Acpy); if (n % K_STRIDE == 0) { squarepad_sgemm(n, Acpy, B, C); } else { float *Bcpy = calloc(npad * npad, sizeof(float)); float *Ccpy = calloc(npad * npad, sizeof(float)); transpose(n, npad, A, Acpy); pad(n, npad, B, Bcpy); pad(n, npad, C, Ccpy); /* Call matrix multiply on padded matrices. */ squarepad_sgemm(npad, Acpy, Bcpy, Ccpy); unpad(n, npad, Ccpy, C); free(Bcpy); free(Ccpy); } free(Acpy); }
/* * Decode a message */ secure_vector<byte> EME::decode(const secure_vector<byte>& msg, size_t key_bits) const { return unpad(msg.data(), msg.size(), key_bits); }
/* * Decode a message */ secure_vector<byte> EME::decode(const byte msg[], size_t msg_len, size_t key_bits) const { return unpad(msg, msg_len, key_bits); }
void decrypt_block(uint32_t round_keys[NUM_ROUND_KEYS][ROUND_KEY_LENGTH], uint32_t current_block[BLOCK_LENGTH], uint32_t past_block[BLOCK_LENGTH], char* output, int test) { int last_byte_loc; uint32_t next_past_block[BLOCK_LENGTH]; // stores next_block so it can be set to current_block after CBC after decryption memcpy(next_past_block, current_block, BLOCK_LENGTH * BYTE_CHUNK_SIZE); /* * START CODE BLOCK * * Following code from serpent.c file in official submission code (http://www.cl.cam.ac.uk/~rja14/Papers/serpent.tar.gz) with minor name changes. See 'sboxes.h' for note on copyright. */ register uint32_t x0, x1, x2, x3; register uint32_t y0, y1, y2, y3; x0 = current_block[0]; x1 = current_block[1]; x2 = current_block[2]; x3 = current_block[3]; /* Start to decrypt the ciphertext x */ keying(x0, x1, x2, x3, round_keys[32]); InvRND31(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[31]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND30(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[30]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND29(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[29]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND28(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[28]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND27(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[27]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND26(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[26]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND25(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[25]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND24(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[24]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND23(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[23]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND22(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[22]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND21(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[21]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND20(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[20]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND19(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[19]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND18(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[18]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND17(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[17]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND16(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[16]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND15(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[15]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND14(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[14]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND13(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[13]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND12(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[12]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND11(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[11]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND10(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[10]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND09(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[ 9]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND08(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[ 8]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND07(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[ 7]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND06(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[ 6]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND05(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[ 5]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND04(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[ 4]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND03(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[ 3]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND02(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[ 2]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND01(x0, x1, x2, x3, y0, y1, y2, y3); keying(y0, y1, y2, y3, round_keys[ 1]); inv_transform(y0, y1, y2, y3, x0, x1, x2, x3); InvRND00(x0, x1, x2, x3, y0, y1, y2, y3); x0 = y0; x1 = y1; x2 = y2; x3 = y3; keying(x0, x1, x2, x3, round_keys[ 0]); /* The plaintext is now in x */ current_block[0] = x0; current_block[1] = x1; current_block[2] = x2; current_block[3] = x3; /* * END CODE BLOCK */ if (!test) { decrypt_cbc(current_block, past_block); } last_byte_loc = unpad(current_block); decrypt_export_block(output, current_block, last_byte_loc); memcpy(past_block, next_past_block, BLOCK_LENGTH * BYTE_CHUNK_SIZE); }
/* * Decode a message */ SecureVector<byte> EME::decode(const MemoryRegion<byte>& msg, size_t key_bits) const { return unpad(&msg[0], msg.size(), key_bits); }