1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00
v/vlib/net/websocket/utils.v

53 lines
1.5 KiB
V
Raw Normal View History

module websocket
2020-04-26 14:49:31 +03:00
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)
2020-04-26 14:49:31 +03:00
ret[7] = byte(((payload_len & (u64(0xff) << 0)) >> 0) & 0xff)
return ret
}
fn create_masking_key() []byte {
t := time.ticks()
tseq := t % 23237671
2020-05-26 13:50:37 +03:00
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 {
2020-05-26 13:50:37 +03:00
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
}
2020-06-01 20:31:45 +03:00
fn get_nonce(nonce_size int) string {
mut nonce := []byte{len: nonce_size, cap: nonce_size}
2020-05-26 13:50:37 +03:00
alphanum := '0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz'
2020-06-01 20:31:45 +03:00
for i in 0 .. nonce_size {
nonce[i] = alphanum[rand.next(61)]
}
2020-06-01 20:31:45 +03:00
return tos(nonce.data, nonce.len).clone()
2020-05-26 13:50:37 +03:00
}