164921Smarcel/* $OpenBSD: rmd160.c,v 1.3 2001/09/26 21:40:13 markus Exp $ */ 264921Smarcel/*- 364921Smarcel * Copyright (c) 2001 Markus Friedl. All rights reserved. 464921Smarcel * 564921Smarcel * Redistribution and use in source and binary forms, with or without 664921Smarcel * modification, are permitted provided that the following conditions 764921Smarcel * are met: 864921Smarcel * 1. Redistributions of source code must retain the above copyright 9111798Sdes * notice, this list of conditions and the following disclaimer. 1064921Smarcel * 2. Redistributions in binary form must reproduce the above copyright 1164921Smarcel * notice, this list of conditions and the following disclaimer in the 1264921Smarcel * documentation and/or other materials provided with the distribution. 1364921Smarcel * 1464921Smarcel * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1565067Smarcel * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1664921Smarcel * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1764921Smarcel * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 1864921Smarcel * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 1964921Smarcel * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2064921Smarcel * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2164921Smarcel * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2264921Smarcel * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2364921Smarcel * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2464921Smarcel */ 2564921Smarcel 2664921Smarcel/* 2764921Smarcel * Preneel, Bosselaers, Dobbertin, "The Cryptographic Hash Function RIPEMD-160", 2864921Smarcel * RSA Laboratories, CryptoBytes, Volume 3, Number 2, Autumn 1997, 29115705Sobrien * ftp://ftp.rsasecurity.com/pub/cryptobytes/crypto3n2.pdf 30115705Sobrien */ 31115705Sobrien 3264921Smarcel#include <sys/cdefs.h> 3376166Smarkm__FBSDID("$FreeBSD$"); 34162472Snetchild 35162472Snetchild#include <sys/param.h> 36140992Ssobomax#include <sys/systm.h> 3784811Sjhb#include <sys/endian.h> 38140992Ssobomax#include <opencrypto/rmd160.h> 3964921Smarcel 4076166Smarkm#define PUT_64BIT_LE(cp, value) do { \ 41161310Snetchild (cp)[7] = (value) >> 56; \ 42164033Srwatson (cp)[6] = (value) >> 48; \ 4364921Smarcel (cp)[5] = (value) >> 40; \ 44161310Snetchild (cp)[4] = (value) >> 32; \ 4576166Smarkm (cp)[3] = (value) >> 24; \ 4676166Smarkm (cp)[2] = (value) >> 16; \ 47134838Sdfr (cp)[1] = (value) >> 8; \ 48102814Siedowse (cp)[0] = (value); } while (0) 4964921Smarcel 5064921Smarcel#define PUT_32BIT_LE(cp, value) do { \ 51161310Snetchild (cp)[3] = (value) >> 24; \ 52166188Sjeff (cp)[2] = (value) >> 16; \ 5364921Smarcel (cp)[1] = (value) >> 8; \ 5464921Smarcel (cp)[0] = (value); } while (0) 5564921Smarcel 5664921Smarcel#define H0 0x67452301U 5764921Smarcel#define H1 0xEFCDAB89U 5864921Smarcel#define H2 0x98BADCFEU 5967238Sgallatin#define H3 0x10325476U 6067238Sgallatin#define H4 0xC3D2E1F0U 6167238Sgallatin 6267238Sgallatin#define K0 0x00000000U 6364921Smarcel#define K1 0x5A827999U 6468583Smarcel#define K2 0x6ED9EBA1U 6564921Smarcel#define K3 0x8F1BBCDCU 6664921Smarcel#define K4 0xA953FD4EU 6764921Smarcel 68161310Snetchild#define KK0 0x50A28BE6U 6964921Smarcel#define KK1 0x5C4DD124U 70161310Snetchild#define KK2 0x6D703EF3U 71161310Snetchild#define KK3 0x7A6D76E9U 72161310Snetchild#define KK4 0x00000000U 73161310Snetchild 74161310Snetchild/* rotate x left n bits. */ 75161310Snetchild#define ROL(n, x) (((x) << (n)) | ((x) >> (32-(n)))) 7683221Smarcel 7783221Smarcel#define F0(x, y, z) ((x) ^ (y) ^ (z)) 7883221Smarcel#define F1(x, y, z) (((x) & (y)) | ((~x) & (z))) 7983221Smarcel#define F2(x, y, z) (((x) | (~y)) ^ (z)) 8083221Smarcel#define F3(x, y, z) (((x) & (z)) | ((y) & (~z))) 8183221Smarcel#define F4(x, y, z) ((x) ^ ((y) | (~z))) 8283221Smarcel 8383221Smarcel#define R(a, b, c, d, e, Fj, Kj, sj, rj) \ 8483221Smarcel do { \ 8583221Smarcel a = ROL(sj, a + Fj(b,c,d) + X(rj) + Kj) + e; \ 8664921Smarcel c = ROL(10, c); \ 8764921Smarcel } while(0) 8883221Smarcel 8983221Smarcel#define X(i) x[i] 9083221Smarcel 9183221Smarcelstatic u_char PADDING[64] = { 9283221Smarcel 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9383221Smarcel 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9464921Smarcel 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 9564921Smarcel}; 9664921Smarcel 9767051Sgallatinvoid 9867051SgallatinRMD160Init(RMD160_CTX *ctx) 9967051Sgallatin{ 10067051Sgallatin ctx->count = 0; 10167051Sgallatin ctx->state[0] = H0; 10267051Sgallatin ctx->state[1] = H1; 10367051Sgallatin ctx->state[2] = H2; 10467051Sgallatin ctx->state[3] = H3; 10567051Sgallatin ctx->state[4] = H4; 10667051Sgallatin} 10767051Sgallatin 10867051Sgallatinvoid 10967051SgallatinRMD160Update(RMD160_CTX *ctx, const u_char *input, u_int32_t len) 11067051Sgallatin{ 11167051Sgallatin u_int32_t have, off, need; 11267051Sgallatin 11367051Sgallatin have = (ctx->count/8) % 64; 11467051Sgallatin need = 64 - have; 11567051Sgallatin ctx->count += 8 * len; 11667051Sgallatin off = 0; 11767051Sgallatin 11867051Sgallatin if (len >= need) { 11967051Sgallatin if (have) { 12067051Sgallatin memcpy(ctx->buffer + have, input, need); 12183366Sjulian RMD160Transform(ctx->state, ctx->buffer); 12264921Smarcel off = need; 123140992Ssobomax have = 0; 124140992Ssobomax } 125140992Ssobomax /* now the buffer is empty */ 12664921Smarcel while (off + 64 <= len) { 127141468Sjhb RMD160Transform(ctx->state, input+off); 12864921Smarcel off += 64; 12964921Smarcel } 13072543Sjlemon } 131140992Ssobomax if (off < len) 13264921Smarcel memcpy(ctx->buffer + have, input+off, len-off); 13364921Smarcel} 134140992Ssobomax 135140992Ssobomaxvoid 136140992SsobomaxRMD160Final(u_char digest[20], RMD160_CTX *ctx) 137140992Ssobomax{ 138148623Ssobomax int i; 139161310Snetchild u_char size[8]; 140161310Snetchild u_int32_t padlen; 141161310Snetchild 142161310Snetchild PUT_64BIT_LE(size, ctx->count); 143161310Snetchild 144161310Snetchild /* 145161310Snetchild * pad to 64 byte blocks, at least one byte from PADDING plus 8 bytes 146161310Snetchild * for the size 147140992Ssobomax */ 14864921Smarcel padlen = 64 - ((ctx->count/8) % 64); 14964921Smarcel if (padlen < 1 + 8) 15083221Smarcel padlen += 64; 15183221Smarcel RMD160Update(ctx, PADDING, padlen - 8); /* padlen - 8 <= 64 */ 15283221Smarcel RMD160Update(ctx, size, 8); 15383221Smarcel 15483221Smarcel if (digest != NULL) 15564921Smarcel for (i = 0; i < 5; i++) 15683366Sjulian PUT_32BIT_LE(digest + i*4, ctx->state[i]); 15764921Smarcel 15883221Smarcel memset(ctx, 0, sizeof (*ctx)); 15983221Smarcel} 16083221Smarcel 16183221Smarcelvoid 16283221SmarcelRMD160Transform(u_int32_t state[5], const u_char block[64]) 16383221Smarcel{ 16483221Smarcel u_int32_t a, b, c, d, e, aa, bb, cc, dd, ee, t, x[16]; 16583221Smarcel 16683366Sjulian#if BYTE_ORDER == LITTLE_ENDIAN 16764921Smarcel memcpy(x, block, 64); 16883221Smarcel#else 16983221Smarcel int i; 17064921Smarcel 17183221Smarcel for (i = 0; i < 16; i++) 17283221Smarcel x[i] = bswap32(*(const u_int32_t*)(block+i*4)); 17383221Smarcel#endif 17483366Sjulian 17583221Smarcel a = state[0]; 17683221Smarcel b = state[1]; 17783221Smarcel c = state[2]; 17883221Smarcel d = state[3]; 17983221Smarcel e = state[4]; 18083221Smarcel 18183221Smarcel /* Round 1 */ 18283221Smarcel R(a, b, c, d, e, F0, K0, 11, 0); 183111797Sdes R(e, a, b, c, d, F0, K0, 14, 1); 18483221Smarcel R(d, e, a, b, c, F0, K0, 15, 2); 18583221Smarcel R(c, d, e, a, b, F0, K0, 12, 3); 18683366Sjulian R(b, c, d, e, a, F0, K0, 5, 4); 18783221Smarcel R(a, b, c, d, e, F0, K0, 8, 5); 18883221Smarcel R(e, a, b, c, d, F0, K0, 7, 6); 18983221Smarcel R(d, e, a, b, c, F0, K0, 9, 7); 19083221Smarcel R(c, d, e, a, b, F0, K0, 11, 8); 19183221Smarcel R(b, c, d, e, a, F0, K0, 13, 9); 19283221Smarcel R(a, b, c, d, e, F0, K0, 14, 10); 19383221Smarcel R(e, a, b, c, d, F0, K0, 15, 11); 19483221Smarcel R(d, e, a, b, c, F0, K0, 6, 12); 19583366Sjulian R(c, d, e, a, b, F0, K0, 7, 13); 19683221Smarcel R(b, c, d, e, a, F0, K0, 9, 14); 19783221Smarcel R(a, b, c, d, e, F0, K0, 8, 15); /* #15 */ 19883221Smarcel /* Round 2 */ 19983221Smarcel R(e, a, b, c, d, F1, K1, 7, 7); 20083221Smarcel R(d, e, a, b, c, F1, K1, 6, 4); 20183221Smarcel R(c, d, e, a, b, F1, K1, 8, 13); 20283221Smarcel R(b, c, d, e, a, F1, K1, 13, 1); 20383221Smarcel R(a, b, c, d, e, F1, K1, 11, 10); 20483221Smarcel R(e, a, b, c, d, F1, K1, 9, 6); 20583221Smarcel R(d, e, a, b, c, F1, K1, 7, 15); 20683221Smarcel R(c, d, e, a, b, F1, K1, 15, 3); 20783221Smarcel R(b, c, d, e, a, F1, K1, 7, 12); 20883221Smarcel R(a, b, c, d, e, F1, K1, 12, 0); 209111797Sdes R(e, a, b, c, d, F1, K1, 15, 9); 21083221Smarcel R(d, e, a, b, c, F1, K1, 9, 5); 21183221Smarcel R(c, d, e, a, b, F1, K1, 11, 2); 21283221Smarcel R(b, c, d, e, a, F1, K1, 7, 14); 21383221Smarcel R(a, b, c, d, e, F1, K1, 13, 11); 21483221Smarcel R(e, a, b, c, d, F1, K1, 12, 8); /* #31 */ 21583221Smarcel /* Round 3 */ 21683221Smarcel R(d, e, a, b, c, F2, K2, 11, 3); 21783221Smarcel R(c, d, e, a, b, F2, K2, 13, 10); 21883366Sjulian R(b, c, d, e, a, F2, K2, 6, 14); 21983221Smarcel R(a, b, c, d, e, F2, K2, 7, 4); 22083221Smarcel R(e, a, b, c, d, F2, K2, 14, 9); 22183221Smarcel R(d, e, a, b, c, F2, K2, 9, 15); 22283221Smarcel R(c, d, e, a, b, F2, K2, 13, 8); 22383221Smarcel R(b, c, d, e, a, F2, K2, 15, 1); 22483221Smarcel R(a, b, c, d, e, F2, K2, 14, 2); 22583366Sjulian R(e, a, b, c, d, F2, K2, 8, 7); 22683221Smarcel R(d, e, a, b, c, F2, K2, 13, 0); 22783221Smarcel R(c, d, e, a, b, F2, K2, 6, 6); 22883221Smarcel R(b, c, d, e, a, F2, K2, 5, 13); 22983221Smarcel R(a, b, c, d, e, F2, K2, 12, 11); 23083221Smarcel R(e, a, b, c, d, F2, K2, 7, 5); 23183221Smarcel R(d, e, a, b, c, F2, K2, 5, 12); /* #47 */ 23283221Smarcel /* Round 4 */ 23383366Sjulian R(c, d, e, a, b, F3, K3, 11, 1); 23483221Smarcel R(b, c, d, e, a, F3, K3, 12, 9); 23583221Smarcel R(a, b, c, d, e, F3, K3, 14, 11); 23683221Smarcel R(e, a, b, c, d, F3, K3, 15, 10); 23783221Smarcel R(d, e, a, b, c, F3, K3, 14, 0); 23883221Smarcel R(c, d, e, a, b, F3, K3, 15, 8); 23983221Smarcel R(b, c, d, e, a, F3, K3, 9, 12); 24083221Smarcel R(a, b, c, d, e, F3, K3, 8, 4); 24183221Smarcel R(e, a, b, c, d, F3, K3, 9, 13); 24283366Sjulian R(d, e, a, b, c, F3, K3, 14, 3); 24383221Smarcel R(c, d, e, a, b, F3, K3, 5, 7); 24483221Smarcel R(b, c, d, e, a, F3, K3, 6, 15); 24583221Smarcel R(a, b, c, d, e, F3, K3, 8, 14); 24683221Smarcel R(e, a, b, c, d, F3, K3, 6, 5); 24783221Smarcel R(d, e, a, b, c, F3, K3, 5, 6); 24883366Sjulian R(c, d, e, a, b, F3, K3, 12, 2); /* #63 */ 24983221Smarcel /* Round 5 */ 25083221Smarcel R(b, c, d, e, a, F4, K4, 9, 4); 25183221Smarcel R(a, b, c, d, e, F4, K4, 15, 0); 25283221Smarcel R(e, a, b, c, d, F4, K4, 5, 5); 25383221Smarcel R(d, e, a, b, c, F4, K4, 11, 9); 25483221Smarcel R(c, d, e, a, b, F4, K4, 6, 7); 25583221Smarcel R(b, c, d, e, a, F4, K4, 8, 12); 25683366Sjulian R(a, b, c, d, e, F4, K4, 13, 2); 25783221Smarcel R(e, a, b, c, d, F4, K4, 12, 10); 25883221Smarcel R(d, e, a, b, c, F4, K4, 5, 14); 25983221Smarcel R(c, d, e, a, b, F4, K4, 12, 1); 26083221Smarcel R(b, c, d, e, a, F4, K4, 13, 3); 26183221Smarcel R(a, b, c, d, e, F4, K4, 14, 8); 26283221Smarcel R(e, a, b, c, d, F4, K4, 11, 11); 26383221Smarcel R(d, e, a, b, c, F4, K4, 8, 6); 26483366Sjulian R(c, d, e, a, b, F4, K4, 5, 15); 26583221Smarcel R(b, c, d, e, a, F4, K4, 6, 13); /* #79 */ 26683221Smarcel 26783221Smarcel aa = a ; bb = b; cc = c; dd = d; ee = e; 26883221Smarcel 26983221Smarcel a = state[0]; 27083221Smarcel b = state[1]; 27164921Smarcel c = state[2]; 27264921Smarcel d = state[3]; 27364921Smarcel e = state[4]; 27483366Sjulian 27564921Smarcel /* Parallel round 1 */ 27683221Smarcel R(a, b, c, d, e, F4, KK0, 8, 5); 27783221Smarcel R(e, a, b, c, d, F4, KK0, 9, 14); 27864921Smarcel R(d, e, a, b, c, F4, KK0, 9, 7); 27964921Smarcel R(c, d, e, a, b, F4, KK0, 11, 0); 28083221Smarcel R(b, c, d, e, a, F4, KK0, 13, 9); 28183221Smarcel R(a, b, c, d, e, F4, KK0, 15, 2); 28291437Speter R(e, a, b, c, d, F4, KK0, 15, 11); 28364921Smarcel R(d, e, a, b, c, F4, KK0, 5, 4); 28464921Smarcel R(c, d, e, a, b, F4, KK0, 7, 13); 285111797Sdes R(b, c, d, e, a, F4, KK0, 7, 6); 28664921Smarcel R(a, b, c, d, e, F4, KK0, 8, 15); 28764921Smarcel R(e, a, b, c, d, F4, KK0, 11, 8); 28864921Smarcel R(d, e, a, b, c, F4, KK0, 14, 1); 28964921Smarcel R(c, d, e, a, b, F4, KK0, 14, 10); 29064921Smarcel R(b, c, d, e, a, F4, KK0, 12, 3); 29164921Smarcel R(a, b, c, d, e, F4, KK0, 6, 12); /* #15 */ 29264921Smarcel /* Parallel round 2 */ 29364921Smarcel R(e, a, b, c, d, F3, KK1, 9, 6); 29483366Sjulian R(d, e, a, b, c, F3, KK1, 13, 11); 29564921Smarcel R(c, d, e, a, b, F3, KK1, 15, 3); 29664921Smarcel R(b, c, d, e, a, F3, KK1, 7, 7); 29764921Smarcel R(a, b, c, d, e, F3, KK1, 12, 0); 29883366Sjulian R(e, a, b, c, d, F3, KK1, 8, 13); 29964921Smarcel R(d, e, a, b, c, F3, KK1, 9, 5); 30064921Smarcel R(c, d, e, a, b, F3, KK1, 11, 10); 301166150Snetchild R(b, c, d, e, a, F3, KK1, 7, 14); 302166150Snetchild R(a, b, c, d, e, F3, KK1, 7, 15); 30364921Smarcel R(e, a, b, c, d, F3, KK1, 12, 8); 30464921Smarcel R(d, e, a, b, c, F3, KK1, 7, 12); 30572543Sjlemon R(c, d, e, a, b, F3, KK1, 6, 4); 30672543Sjlemon R(b, c, d, e, a, F3, KK1, 15, 9); 30764921Smarcel R(a, b, c, d, e, F3, KK1, 13, 1); 30864921Smarcel R(e, a, b, c, d, F3, KK1, 11, 2); /* #31 */ 309166150Snetchild /* Parallel round 3 */ 31064921Smarcel R(d, e, a, b, c, F2, KK2, 9, 15); 311166150Snetchild R(c, d, e, a, b, F2, KK2, 7, 5); 312166150Snetchild R(b, c, d, e, a, F2, KK2, 15, 1); 313166150Snetchild R(a, b, c, d, e, F2, KK2, 11, 3); 314166150Snetchild R(e, a, b, c, d, F2, KK2, 8, 7); 315166150Snetchild R(d, e, a, b, c, F2, KK2, 6, 14); 31664921Smarcel R(c, d, e, a, b, F2, KK2, 6, 6); 31783366Sjulian R(b, c, d, e, a, F2, KK2, 14, 9); 31883366Sjulian R(a, b, c, d, e, F2, KK2, 12, 11); 319161310Snetchild R(e, a, b, c, d, F2, KK2, 13, 8); 320161310Snetchild R(d, e, a, b, c, F2, KK2, 5, 12); 321161310Snetchild R(c, d, e, a, b, F2, KK2, 14, 2); 322161310Snetchild R(b, c, d, e, a, F2, KK2, 13, 10); 323166150Snetchild R(a, b, c, d, e, F2, KK2, 13, 0); 324166150Snetchild R(e, a, b, c, d, F2, KK2, 7, 4); 325166150Snetchild R(d, e, a, b, c, F2, KK2, 5, 13); /* #47 */ 326166150Snetchild /* Parallel round 4 */ 327166150Snetchild R(c, d, e, a, b, F1, KK3, 15, 8); 328170307Sjeff R(b, c, d, e, a, F1, KK3, 5, 6); 329166150Snetchild R(a, b, c, d, e, F1, KK3, 8, 4); 330166188Sjeff R(e, a, b, c, d, F1, KK3, 11, 1); 331170307Sjeff R(d, e, a, b, c, F1, KK3, 14, 3); 332166150Snetchild R(c, d, e, a, b, F1, KK3, 14, 11); 33364921Smarcel R(b, c, d, e, a, F1, KK3, 6, 15); 33464921Smarcel R(a, b, c, d, e, F1, KK3, 14, 0); 33564921Smarcel R(e, a, b, c, d, F1, KK3, 6, 5); 33664921Smarcel R(d, e, a, b, c, F1, KK3, 9, 12); 33783366Sjulian R(c, d, e, a, b, F1, KK3, 12, 2); 33864921Smarcel R(b, c, d, e, a, F1, KK3, 9, 13); 33964921Smarcel R(a, b, c, d, e, F1, KK3, 12, 9); 340161611Snetchild R(e, a, b, c, d, F1, KK3, 5, 7); 341166150Snetchild R(d, e, a, b, c, F1, KK3, 15, 10); 34264921Smarcel R(c, d, e, a, b, F1, KK3, 8, 14); /* #63 */ 34364921Smarcel /* Parallel round 5 */ 34472543Sjlemon R(b, c, d, e, a, F0, KK4, 8, 12); 34572543Sjlemon R(a, b, c, d, e, F0, KK4, 5, 15); 34664921Smarcel R(e, a, b, c, d, F0, KK4, 12, 10); 34764921Smarcel R(d, e, a, b, c, F0, KK4, 9, 4); 348161611Snetchild R(c, d, e, a, b, F0, KK4, 12, 1); 349166150Snetchild R(b, c, d, e, a, F0, KK4, 5, 5); 35064921Smarcel R(a, b, c, d, e, F0, KK4, 14, 8); 351161611Snetchild R(e, a, b, c, d, F0, KK4, 6, 7); 352166150Snetchild R(d, e, a, b, c, F0, KK4, 8, 6); 353161611Snetchild R(c, d, e, a, b, F0, KK4, 13, 2); 354161611Snetchild R(b, c, d, e, a, F0, KK4, 6, 13); 35564921Smarcel R(a, b, c, d, e, F0, KK4, 5, 14); 35683366Sjulian R(e, a, b, c, d, F0, KK4, 15, 0); 35783366Sjulian R(d, e, a, b, c, F0, KK4, 13, 3); 358161310Snetchild R(c, d, e, a, b, F0, KK4, 11, 9); 359161310Snetchild R(b, c, d, e, a, F0, KK4, 11, 11); /* #79 */ 360161310Snetchild 361166150Snetchild t = state[1] + cc + d; 362166150Snetchild state[1] = state[2] + dd + e; 363166150Snetchild state[2] = state[3] + ee + a; 364166150Snetchild state[3] = state[4] + aa + b; 365166150Snetchild state[4] = state[0] + bb + c; 366166150Snetchild state[0] = t; 367166150Snetchild} 368166150Snetchild