char* bcrypt(int rounds, unsigned char* salt, unsigned char* input) { int i; char* output = malloc(61 * sizeof(char)); unsigned int cdata[16]; unsigned char ctext[25]; memcpy(cdata, CIPHER_TEXT, 16 * sizeof(int)); blowfish_context_t *ctx = (blowfish_context_t *)malloc(sizeof(blowfish_context_t)); eks_blowfish_setup(ctx, rounds, salt, input); for (i = 0; i < 64; i++) { encrypt_ecb(ctx, cdata); } for (i = 0; i < 6; i++) { ctext[4 * i + 3] = cdata[i] & 0xff; cdata[i] >>= 8; ctext[4 * i + 2] = cdata[i] & 0xff; cdata[i] >>= 8; ctext[4 * i + 1] = cdata[i] & 0xff; cdata[i] >>= 8; ctext[4 * i + 0] = cdata[i] & 0xff; } ctext[23] = '\0'; snprintf(output, 8, "$2a$%2.2u$", rounds); memcpy(output + 7, base64_encode(salt), 22); memcpy(output + 29, base64_encode(ctext), 31); output[61] = '\0'; return output; }
int SelfTestGost14Ecb() { unsigned char ctx[kEcb14ContextLen]; unsigned char output[textLen14]; if (init_ecb_14_impl(kSeltTestGost14MasterKeyData, ctx)) return -1; if (encrypt_ecb(ctx, kSeltTestGost14PlainText, output, textLen14)) return -1; if (memcmp(output, kSeltTestGost14EcbEncText, textLen14)) return -1; return 0; };