53 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			V
		
	
	
module websocket
 | 
						|
 | 
						|
import time
 | 
						|
import rand
 | 
						|
import math
 | 
						|
import crypto.sha1
 | 
						|
import encoding.base64
 | 
						|
 | 
						|
fn htonl64(payload_len u64) byteptr {
 | 
						|
	mut ret := malloc(8)
 | 
						|
	ret[0] = byte(((payload_len & (u64(0xff) << 56)) >> 56) & 0xff)
 | 
						|
	ret[1] = byte(((payload_len & (u64(0xff) << 48)) >> 48) & 0xff)
 | 
						|
	ret[2] = byte(((payload_len & (u64(0xff) << 40)) >> 40) & 0xff)
 | 
						|
	ret[3] = byte(((payload_len & (u64(0xff) << 32)) >> 32) & 0xff)
 | 
						|
	ret[4] = byte(((payload_len & (u64(0xff) << 24)) >> 24) & 0xff)
 | 
						|
	ret[5] = byte(((payload_len & (u64(0xff) << 16)) >> 16) & 0xff)
 | 
						|
	ret[6] = byte(((payload_len & (u64(0xff) << 8)) >> 8) & 0xff)
 | 
						|
	ret[7] = byte(((payload_len & (u64(0xff) << 0)) >> 0) & 0xff)
 | 
						|
	return ret
 | 
						|
}
 | 
						|
 | 
						|
fn create_masking_key() []byte {
 | 
						|
	t := time.ticks()
 | 
						|
	tseq := t % 23237671
 | 
						|
	mut rnd := rand.new_pcg32(u64(t), u64(tseq))
 | 
						|
	mask_bit := byte(rnd.bounded_next(u32(math.max_i32)))
 | 
						|
	buf := [`0`].repeat(4)
 | 
						|
	C.memcpy(buf.data, &mask_bit, 4)
 | 
						|
	return buf
 | 
						|
}
 | 
						|
 | 
						|
fn create_key_challenge_response(seckey string) string {
 | 
						|
	guid := '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
 | 
						|
	sha1buf := seckey + guid
 | 
						|
	hash := sha1.sum(sha1buf.bytes())
 | 
						|
	hashstr := string(byteptr(hash.data))
 | 
						|
	b64 := base64.encode(hashstr)
 | 
						|
	unsafe {
 | 
						|
		sha1buf.free()
 | 
						|
		hash.free()
 | 
						|
	}
 | 
						|
	return b64
 | 
						|
}
 | 
						|
 | 
						|
fn get_nonce() string {
 | 
						|
	mut nonce := []byte{}
 | 
						|
	alphanum := '0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz'
 | 
						|
	for _ in 0 .. 18 {
 | 
						|
		nonce << alphanum[rand.next(61)]
 | 
						|
	}
 | 
						|
	return string(byteptr(nonce.data))
 | 
						|
}
 |