Qþ¤_µ¾êu¡ÕC2S'ùñ3j˜¦<@÷ÈàôùHH¾H3íq¨X\ï×}üSµî—¨ ›…|ýlU¸�Ém§ö]Ã=œ™#í«v2}Õâ»@3M½Á¾yèËœïß]_w”—è@¢;«\ÙÏÜŠwª¯ÄÓ}ð"·‘F îûvž—	/l.b¯®fZV¢ÅÕ´ÄÉà4×ÓUË	Š-±YõÇvoäñ!%¨ô†žSFžzø‹¾Ça[Ù¯¡ô„ëŒx¼�.4ÁTzû‹ê,±CÝÛ>¯f3«¾µXÞq¶‡ÆÖp�ã%µ‡xÖQ³ûY‰.¯Å�Ï/èžzP¹£i?þ|´3«¼zfåöHÎ‘SU¢PÐ÷©�à÷½
ó×»µ³üz4µƒ[©š+WÎ£.	fï¾xÔ5Áôÿ!\¾Ÿøòó›8LiÌë„ôŽìÜ¹	V~ Ávýé¹ùR	Ô3£å@6B¼J’Œ¥ý+‹ÑLoº†éØO�Áuø>‚‡¹ ¹&\5Ó�“$_$@ï%Øò÷UF™ž×Q"ˆ¢å~£É¢–ª¸*¸Ú`Ù2ô‡® <¸ÒPc–Í‚Eè	„à¦r›´ƒô²€â±¹ÊkÖøTw†E„�º²ºaí‘ïÆeÔˆ¯\âHlíÒ{@ÜÞ68!Ë«:%ŸSðpò€±9^{>Fÿn>:€GqâŸyE½w !þ#Æ`ñLÒ0ø‚Õƒ_	Iµ5ÎôytÂ·TE”xïdÌRòŒMS>2±t<ŠYF.ä“à¸'ÌTÝ”µ)¡«@¢y%¯²¬¿Ôº�žÉG¡ÌðÒ%ÖïtŒo³/Ã–ÆéªŠ$³æ7H!£{WKHæÆ{Ñ¡N@-³uéS!KçVJ8^Ž˜jè}Àkì
»ž+ýšÐ%O+^›[±™¹-çÀƒÊu|¬/îQi¯LY¢ ÙQö&y‘(ºEb·ÙPFÊŸh`yM`
$¦Œh¸jÅâ6·?–…k+Ëùødwgz;(.8v„gõã¼£zcÛYâáSüŠDŒ/ÆZ%LÛØ¬•æR°“ÏJŽÒ¢³ïà¹#à£ræ,2C¼¸U<É.Ã‚K.”¯.	,\;Æ0$½ðl³v„r©¿÷Tk'Ï
Ù§iÂ&&£º4!Í€³ë	<âàíC¨jœ,’¶oMcSˆ%ôˆfÇ«þ¹v²C$6ï_ÀNîwg�Ãhó!°—27µ‡� ÙFñ MÇËxgQeÈŒÿÔ$ÿ¸%¼/¶+ã¨¢ÜXx¢4”¦“Ÿ™£2aaÓú8F°ØÛH©lZ"Éo(XðA{ÿT€Ô¥~AôÕ™S„‹mE°©}"ù¸4¨CÚ€ùìi¼såþÐ=‚ÆÐAþÐL�‡£ù€
bs2u¿�Âí•‹LÇì;O5Ï¶_«ÇUÄœN©^¼•Ÿ9Ô<ib”7ØkÈ*å	œ…$îÉtèíÊz%§ü›óÛÚ‰ZN±½õýëM±aí—Õ›,ì»"ŸZÖ.Ø"(+œh‚QÊÉÌƒöÚöh5wzè7‡�c�Ö¨ß"¨¿Pî¤««r^³¤ó€øW0§ÅpëŸ?%[‰!.é×H@Ñ
ê%Ùy°d˜e´UW(¸}Ð õHÕ´ª ~!tæ¸úL¿]jÆÍ|Æ˜ð*?@j•ˆ.ÚB~Hú¢á?‰qÇqß]JŒí[_œÀ “Ùaí�X¹§ÿÒ7¨…ýY‰í¥¢Q†~Ì,å=ppkLÙ€çÊ¹ ¢ñÖ¬ŸRóB©·xŸë<t¦¦ªŸs€È¶Ž•ˆÏIG7GyQ”ÚOØ»t	¯EÇwÓ|ªÇB;ÿnØ°L•k'èÝ\X¬ø†­A¶Ø­*¬|wSÀkDXn�cÆC�âƒÎ*É[ìU æ¤zó]ÔP¿²e]¯2²«£‡ÊÖè¬c¾Óˆ$¥³É(;
°¢ªÎ2lÊTTy
,BKpKœû‘â«{—k.ß³t2f(/1y‘¨¦%`5d‚ÌyÛ¨,’EÊ—t£¶þ‡|áô9H�Ž+¢sUß$QZ@¦'Ñ¥taÁ+r‡°3“%u �ÊRYF°®ô<«½Dä'—{õc4.SåðÌ�ÛMýo0¶Ö¿]â‰—RGçµÀË%NlÚ$˜]¡"·s $Mo5š¸ý*þgQÚQ/hCü ®›=¶‹VJQäÙ"™GÈ—§]ƒeüÎ^¯–Ò—*™ø†j*‚6–?pÔtÌ­µp�›OóNÀ“ùïSýªvMõ¾Û$I¬²S°0	ýÌíÈ‚:5Š"¢m?n.?ù&Ã`Ÿ k�¥¦)Äuà×Qg+×…€b2‚ž/ÄÙÇ�0‹·7@CðiqÏ`œÅû)”$vÏ±Ih…–z-©¼Õ‚%–%üocágš¬ÝD£†Î·Öè\H£†L—±	HÇ´"B×El¤SÔx¢´ˆcLvœ&²I¢rå…ýœÍ)ç‰¯ÐHÑ¸ÈšåÁ’W6®Z^Úö@ü
èTÓl)¬Æu½º®ËÓÌ£Ñ7,�¢j)šæ¿Ï ï'µÚ»tXì A—	f(wR(Šr›�ºO¥¿Ë|ÂNóIK
d§”Ž8/C•–Ö³4Fæjú‰ëõJµ"Ë‹�ë=V9F_›‰Ú
ë`àsÇÈX0ùÄmh”#îjc� Ö-¦[Gw›óHÃ,¿)oðH…‚�¨xG³ý|Y£óÅ"£vf›·Ñ³�jŽx�ˆµS½|‘©/ÞèáYb¥'Fæjú‰ëõJµ"Ë‹�ë=V9F_›‰Ú
ë`àsÇÈ(¦EW{Ÿº;üð=”¾–±6X0ùÄmh”#îjc� Ö-¦…‚�¨xG³ý|Y£óÅ"£k§O’‡I*a¦ë+PgÊvf›·Ñ³�jŽx�ˆµÜ¼´0¬²íö+‹„2šµZ³v(d÷éˆÄïvdJÑ·~… E´µïÑtbD5?;ø‡Ü˜rNg	Ñ\—fX�Ž®áA¯B\1†îù
ôŽè ®•@C zsçðºR?ÕK�†•,ñ©íãC‹5ˆdiB.güOÜž'QTˆÈèm[×	¶ôø”ÈF§èÖKk�áÿÅ¾zûC¾æC9ˆø‰VÐ¾ìgîÊaF•2ê}½íÛó¶Ì&šÊCFæjú‰ëõJµ"Ë‹�ë=áhî„oéÙŠÊeM§'f1¬èÚÐ0gÈ)¬;0>Ÿ" ÊH<Bcuv¨ó%ëöD¬ááU8¸4d˜šÊÌk­£$‘E—Áævófx–†t°öe÷¹¯ï¸Dl˜f	vØx¿¨SFH6ÇÙú¹(!Ð6y"yƒc·DœÓâÜf¥&Ÿ�X0ùÄmh”#îjc� Ö-¦+ž«qLíªÁiwPjE%�“RheØ…�[®8}›ÍrÍ,JcÈÅé¨ñ§îû=ø=êUÖÍM™¡Ò?ÏL¸îÇÖšF¨�KÑ„œGö¿õ)àé/ê¬ÂLÐÊßyŽg×�®un-×@ÌËµÈ‘ú¹0ÙýÛÊRù¼iÄyT¢nÕêµoI
ªåÁÞKC[æÈ%uâßéëþæä%hÉ`àããeÈ{Ý¤ÅÒÍÔw*
¾žíY5b;ìg¹F#äï…æ÷j.²{õDþd¿%ƒžEß7¬“ºçj;ÁG*
ÔŽ
•>å%þ¥LwÛ\¤Ä)3í-s(Ñâ SªVc/W,ª DÖE‰«™ádC(Ø²À¸gO½]µŸ‰NÆ0ƒâOMä#akŽswÛç�ë›žF@aÅ®HdÓÇ0²Ž$TÅ3	S˜ØSh($}Ã´…>Û�–`Øé5Ÿ�ë#vÒàqÌoû–æÁªbý°‘O�:A¨rá»¯F“6¤È_^ œÕÉÕ©`Úš6>ÃÙ�š´[ˆÅzšNRÜÅ¤¯_Z� “î?ƒZ`Ð68Ú†Á§ë~÷x`q3Ï%íä%ülþas=óýc¼iquÈÿ+!Yî°8^ƒB~e0wM‘·ÞÊN¹%Ö‚-fí±Rf¾lŒ›7‚ZÖ’Ù‘D·ÎË‡Ú^±É9‹®>Ï°Žó77¿[Z^•ŸøS`��ðÖDAZî™Ô6“;¨ãp¬Š)œ§È ƒW÷ª-`ÌéÑúsç°Ø¸À¬Û!5¬4vÜÝŒÉ“)¶mé�×rùªOóå?<W“6^»ì“ðj¯�cw¡-s_n°Ì›FP+Ï5ú«þlÚÁ¬w6Ú=¨yAxÜ»Y¨:'<ÛÊ?îKcÑ}9N
"¯_Ð•ÕµEÁv­Š Å}íE¹Ã þÏÎô¶,�¥S÷;Ÿ,šŠÌþ6wíá.Z¥AÝ¢‰ÄnùA'`yÜvl"€¾%I“Bå)—'6L¾Ù^J ³ý¥¯�7{:NÆ3:Kò�u›Ñ/Ò_î Q¡ê�!µ!>¶tôU\® u´³°žR‘ÚbdÁ97qjÝÂÄ¸'?„œ/R›!B(Ì>òµá�ª «“Õ? >ùe¡
J:Ë!å·"\¥ß^Ë�@ònïIP Åºª<Àí Y[o¶Æ\&AdUö5(a›ÙÆzÛ¾‰ó?i7Ãl¡&ZQ¥ãÑîìù4ÝkgÇvçÌ3w²†ž§\c‚û^À"t‚ðŸ@›]Æ-•îÆ»Ó<žùƒK�ò<‰‘áŒ˜ä%õÅ7|„˜°EmÙÑ)î{fE_UÁ …�‹eÑ±ƒ®i/A�¶ÈÙ‚šqgx‚`îÜ¼äòœ^5£KKy¯ãòAó-°È5læïdUèÜ6÷\â„§Ÿ¢ä$ë?÷„I§½s÷0¬c9÷âŒ1j\—žX@Â;^í^üg¿y®œA@¡/œ¯ÿú®Z`2‚�¾ÿ}lD€‹¢Þ\	«�I“f…
ï5Ë/ŒúÕl°‚ßæ.L"aŒ;Fê<IˆÍ¬Ð×½€V«px«}Ä2%ƒ(Â\Ö�½–‚p0dNI¸ PAï&îæK¬»®¼{Pæ¸àL­³ÙiíÁ1fÉ3Î–‡sìŽ›l-a*´CÝOaà\¨Ìë*4z\�UÕ^¼Œäj~æqu™w¼dAUü!£“¾;,Ÿ|ØÇ.üSþ&	ŠÇês„ÿ`¡Ó•2›:ë	ˆ�LT\ùLúò²qé+±#äµˆè‰Y�àþI¢ ¥]Ïf¦Ù÷7ÛzX‹zåE.jÕ/ëZÈþ×tuœÇ«’X:îÄ²·N¦ñ¤O~±ô±Må=G €›øzÁ@õ)`X’ÝÓÜ¨<“Äü�+¦Ô»ˆÜ4�àår:ƒ÷k	
Ûr¤†`kX~/÷›Æ0±ü¹•��Ê“ùg©«Ô}A7QC¢špƒdËüû˜ößËíîÊ±n�M_Ã=®b/
nst char *key, size_t key_len, const char *salt, char *encrypted)
{
	blf_ctx state;
	u_int32_t rounds, i, k;
	u_int16_t j;
	u_int8_t salt_len, logr, minor;
	u_int8_t ciphertext[4 * BCRYPT_BLOCKS+1] = "OrpheanBeholderScryDoubt";
	u_int8_t csalt[BCRYPT_MAXSALT];
	u_int32_t cdata[BCRYPT_BLOCKS];
	int n;

	/* Discard "$" identifier */
	salt++;

	if (*salt > BCRYPT_VERSION) {
		/* How do I handle errors ? Return ':' */
		strcpy(encrypted, error);
		return;
	}

	/* Check for minor versions */
	if (salt[1] != '$') {
		 switch (salt[1]) {
		 case 'a': /* 'ab' should not yield the same as 'abab' */
		 case 'b': /* cap input length at 72 bytes */
			 minor = salt[1];
			 salt++;
			 break;
		 default:
			 strcpy(encrypted, error);
			 return;
		 }
	} else
		 minor = 0;

	/* Discard version + "$" identifier */
	salt += 2;

	if (salt[2] != '$') {
		/* Out of sync with passwd entry */
		strcpy(encrypted, error);
		return;
	}

	/* Computer power doesn't increase linear, 2^x should be fine */
	n = atoi(salt);
	if (n > 31 || n < 0) {
		strcpy(encrypted, error);
		return;
	}
	logr = (u_int8_t)n;
	if ((rounds = (u_int32_t) 1 << logr) < BCRYPT_MINROUNDS) {
		strcpy(encrypted, error);
		return;
	}

	/* Discard num rounds + "$" identifier */
	salt += 3;

	if (strlen(salt) * 3 / 4 < BCRYPT_MAXSALT) {
		strcpy(encrypted, error);
		return;
	}

	/* We dont want the base64 salt but the raw data */
	decode_base64(csalt, BCRYPT_MAXSALT, (u_int8_t *) salt);
	salt_len = BCRYPT_MAXSALT;
	if (minor <= 'a')
		key_len = (u_int8_t)(key_len + (minor >= 'a' ? 1 : 0));
	else
	{
		/* cap key_len at the actual maximum supported
		* length here to avoid integer wraparound */
		if (key_len > 72)
			key_len = 72;
		key_len++; /* include the NUL */
	}


	/* Setting up S-Boxes and Subkeys */
	Blowfish_initstate(&state);
	Blowfish_expandstate(&state, csalt, salt_len,
		(u_int8_t *) key, key_len);
	for (k = 0; k < rounds; k++) {
		Blowfish_expand0state(&state, (u_int8_t *) key, key_len);
		Blowfish_expand0state(&state, csalt, salt_len);
	}

 	/* This can be precomputed later */
	j = 0;
	for (i = 0; i < BCRYPT_BLOCKS; i++)
		cdata[i] = Blowfish_stream2word(ciphertext, 4 * BCRYPT_BLOCKS, &j);

	/* Now do the encryption */
	for (k = 0; k < 64; k++)
		blf_enc(&state, cdata, BCRYPT_BLOCKS / 2);

	for (i = 0; i < BCRYPT_BLOCKS; i++) {
		ciphertext[4 * i + 3] = cdata[i] & 0xff;
		cdata[i] = cdata[i] >> 8;
		ciphertext[4 * i + 2] = cdata[i] & 0xff;
		cdata[i] = cdata[i] >> 8;
		ciphertext[4 * i + 1] = cdata[i] & 0xff;
		cdata[i] = cdata[i] >> 8;
		ciphertext[4 * i + 0] = cdata[i] & 0xff;
	}

	i = 0;
	encrypted[i++] = '$';
	encrypted[i++] = BCRYPT_VERSION;
	if (minor)
		encrypted[i++] = minor;
	encrypted[i++] = '$';

	snprintf(encrypted + i, 4, "%2.2u$", logr & 0x001F);

	encode_base64((u_int8_t *) encrypted + i + 3, csalt, BCRYPT_MAXSALT);
	encode_base64((u_int8_t *) encrypted + strlen(encrypted), ciphertext,
		4 * BCRYPT_BLOCKS - 1);
	memset(&state, 0, sizeof(state));
	memset(ciphertext, 0, sizeof(ciphertext));
	memset(csalt, 0, sizeof(csalt));
	memset(cdata, 0, sizeof(cdata));
}

u_int32_t bcrypt_get_rounds(const char * hash)
{
  /* skip past the leading "$" */
  if (!hash || *(hash++) != '$') return 0;

  /* skip past version */
  if (0 == (*hash++)) return 0;
  if (*hash && *hash != '$') hash++;
  if (*hash++ != '$') return 0;

  return  atoi(hash);
}

static void
encode_base64(u_int8_t *buffer, u_int8_t *data, u_int16_t len)
{
	u_int8_t *bp = buffer;
	u_int8_t *p = data;
	u_int8_t c1, c2;
	while (p < data + len) {
		c1 = *p++;
		*bp++ = Base64Code[(c1 >> 2)];
		c1 = (c1 & 0x03) << 4;
		if (p >= data + len) {
			*bp++ = Base64Code[c1];
			break;
		}
		c2 = *p++;
		c1 |= (c2 >> 4) & 0x0f;
		*bp++ = Base64Code[c1];
		c1 = (c2 & 0x0f) << 2;
		if (p >= data + len) {
			*bp++ = Base64Code[c1];
			break;
		}
		c2 = *p++;
		c1 |= (c2 >> 6) & 0x03;
		*bp++ = Base64Code[c1];
		*bp++ = Base64Code[c2 & 0x3f];
	}
	*bp = '\0';
}
