void sha2_large_common_nextBlock(sha2_large_common_ctx_t* ctx, const void* block){ uint64_t w[16], wx; uint64_t a[8]; uint64_t t1, t2; const uint64_t *k=sha2_large_common_const; uint8_t i; i=16; do{ w[16-i] = change_endian64(*((const uint64_t*)block)); block = (uint8_t*)block + 8; }while(--i); memcpy(a, ctx->h, 8*8); for(i=0; i<80; ++i){ if(i<16){ wx=w[i]; }else{ wx = SIGMA_b(w[14]) + w[9] + SIGMA_a(w[1]) + w[0]; memmove(&(w[0]), &(w[1]), 15*8); w[15] = wx; } t1 = a[7] + SIGMA_1(a[4]) + CH(a[4], a[5], a[6]) + pgm_read_uint64_t_P(k++) + wx; t2 = SIGMA_0(a[0]) + MAJ(a[0], a[1], a[2]); memmove(&(a[1]), &(a[0]), 7*8); a[0] = t1 + t2; a[4] += t1; } i=7; do{ ctx->h[i] += a[i]; }while(i--); ctx->length += 1; }
unsigned long long guppi_udp_packet_seq_num(const struct guppi_udp_packet *p) { // XXX Temp for new baseband mode, blank out top 8 bits which // contain channel info. unsigned long long tmp = change_endian64((unsigned long long *)p->data); tmp &= 0x00FFFFFFFFFFFFFF; return(tmp); //return(change_endian64((unsigned long long *)(p->data))); }
void parkes_to_guppi(struct guppi_udp_packet *b, const int acc_len, const int npol, const int nchan) { /* Convert IBOB clock count to packet count. * This assumes 2 samples per IBOB clock, and that * acc_len is the actual accumulation length (=reg_acclen+1). */ const unsigned int counts_per_packet = (nchan/2) * acc_len; unsigned long long *packet_idx = (unsigned long long *)b->data; (*packet_idx) = change_endian64(packet_idx); (*packet_idx) /= counts_per_packet; (*packet_idx) = change_endian64(packet_idx); /* Reorder from the 2-pol Parkes ordering */ int i; char tmp[GUPPI_MAX_PACKET_SIZE]; char *pol0, *pol1, *pol2, *pol3, *in; in = b->data + sizeof(long long); if (npol==2) { pol0 = &tmp[0]; pol1 = &tmp[nchan]; for (i=0; i<nchan/2; i++) { /* Each loop handles 2 values from each pol */ memcpy(pol0, in, 2*sizeof(char)); memcpy(pol1, &in[2], 2*sizeof(char)); pol0 += 2; pol1 += 2; in += 4; } } else if (npol==4) { pol0 = &tmp[0]; pol1 = &tmp[nchan]; pol2 = &tmp[2*nchan]; pol3 = &tmp[3*nchan]; for (i=0; i<nchan; i++) { /* Each loop handles one sample */ *pol0 = *in; in++; pol0++; *pol1 = *in; in++; pol1++; *pol2 = *in; in++; pol2++; *pol3 = *in; in++; pol3++; } } memcpy(b->data + sizeof(long long), tmp, sizeof(char) * npol * nchan); }
void sha2_large_common_lastBlock(sha2_large_common_ctx_t* ctx, const void* block, uint16_t length_b){ while(length_b >= 1024){ sha2_large_common_nextBlock(ctx, block); block = (uint8_t*)block + 1024/8; length_b -= 1024; } uint8_t buffer[1024/8]; uint64_t len; len = ((uint64_t)ctx->length)*1024LL + length_b; len = change_endian64(len); memset(buffer, 0, 1024/8); memcpy(buffer, block, (length_b+7)/8); buffer[length_b/8] |= 0x80>>(length_b%8); if(length_b>1024-128-1){ /* length goes into the next block */ sha2_large_common_nextBlock(ctx, buffer); memset(buffer, 0, 120); } memcpy(&(buffer[128-8]), &len, 8); sha2_large_common_nextBlock(ctx, buffer); }
unsigned long long guppi_udp_packet_seq_num(const struct guppi_udp_packet *p) { return(change_endian64((unsigned long long *)(p->data))); }