v/vlib/crypto
2024-08-03 19:52:39 +03:00
..
aes crypto.aes: optimise performance (#20674) 2024-01-27 21:38:34 +02:00
bcrypt all: unwrap const() blocks 2023-11-25 10:02:51 +03:00
blake2b crypto.blake2b: fix erroneous comment in unit tests (#20235) 2023-12-21 11:25:27 +02:00
blake2s crypto.blake2b: fix erroneous comment in unit tests (#20235) 2023-12-21 11:25:27 +02:00
blake3 crypto.blake3: fix typo on Digest comment (#20991) 2024-03-11 07:03:33 +02:00
blowfish crypto.blowfish: apply @[direct_array_access] to very commonly used functions (#21771) 2024-06-30 20:48:05 +03:00
cipher crypto.cipher: make Stream.xor_key_stream implementers require a mutable receiver (#21974) 2024-08-01 16:04:09 +03:00
des all: unwrap const() blocks 2023-11-25 10:02:51 +03:00
ed25519 crypto.ed25519: fix proted -> ported typo in README.md (#21274) 2024-04-13 08:53:23 +03:00
hmac crypto: add a crypto.sha3 hash and extended output functions (#21664) 2024-06-11 15:39:16 +03:00
internal/subtle all: update copyright year (#20334) 2024-01-01 23:29:54 +02:00
md5 hash: make public the hash.Hash interface, add tests to current implementers (#21984) 2024-08-03 19:52:39 +03:00
pem all: unwrap const() blocks 2023-11-25 10:02:51 +03:00
rand all: update copyright year (#20334) 2024-01-01 23:29:54 +02:00
rc4 crypto.cipher: make Stream.xor_key_stream implementers require a mutable receiver (#21974) 2024-08-01 16:04:09 +03:00
sha1 hash: make public the hash.Hash interface, add tests to current implementers (#21984) 2024-08-03 19:52:39 +03:00
sha3 crypto.sha3: remove unnecessary return at the end of the write function (#21669) 2024-06-12 10:29:13 +03:00
sha256 hash: make public the hash.Hash interface, add tests to current implementers (#21984) 2024-08-03 19:52:39 +03:00
sha512 hash: make public the hash.Hash interface, add tests to current implementers (#21984) 2024-08-03 19:52:39 +03:00
crypto.v tools: make v test-cleancode test everything by default (#10050) 2021-05-08 13:32:29 +03:00
README.md doc: update trim_doc_node_description, make module readmes more uniform (#20792) 2024-02-12 12:38:47 +02:00

Description

crypto is a module that exposes cryptographic algorithms to V programs.

Each submodule implements things differently, so be sure to consider the documentation of the specific algorithm you need, but in general, the method is to create a cipher struct using one of the module functions, and then to call the encrypt or decrypt method on that struct to actually encrypt or decrypt your data.

This module is a work-in-progress. For example, the AES implementation currently requires you to create a destination buffer of the correct size to receive the decrypted data, and the AesCipher encrypt and decrypt functions only operate on the first block of the src.

The implementations here are loosely based on Go's crypto package.

Examples

AES

import crypto.aes
import crypto.rand

fn main() {
	// remember to save this key somewhere if you ever want to decrypt your data
	key := rand.bytes(32)!
	println('KEY: ${key}')

	// this data is one block (16 bytes) big
	mut data := 'THIS IS THE DATA'.bytes()

	println('generating cipher')
	cipher := aes.new_cipher(key)

	println('performing encryption')
	mut encrypted := []u8{len: aes.block_size}
	cipher.encrypt(mut encrypted, data)
	println(encrypted)

	println('performing decryption')
	mut decrypted := []u8{len: aes.block_size}
	cipher.decrypt(mut decrypted, encrypted)
	println(decrypted)

	assert decrypted == data
}

JWT

import crypto.hmac
import crypto.sha256
import encoding.base64
import json
import time

struct JwtHeader {
	alg string
	typ string
}

struct JwtPayload {
	sub  string
	name string
	iat  int
}

fn main() {
	sw := time.new_stopwatch()
	secret := 'your-256-bit-secret'
	token := make_token(secret)
	ok := auth_verify(secret, token)
	dt := sw.elapsed().microseconds()
	println('token: ${token}')
	println('auth_verify(secret, token): ${ok}')
	println('Elapsed time: ${dt} uS')
}

fn make_token(secret string) string {
	header := base64.url_encode(json.encode(JwtHeader{'HS256', 'JWT'}).bytes())
	payload := base64.url_encode(json.encode(JwtPayload{'1234567890', 'John Doe', 1516239022}).bytes())
	signature := base64.url_encode(hmac.new(secret.bytes(), '${header}.${payload}'.bytes(),
		sha256.sum, sha256.block_size))
	jwt := '${header}.${payload}.${signature}'
	return jwt
}

fn auth_verify(secret string, token string) bool {
	token_split := token.split('.')
	signature_mirror := hmac.new(secret.bytes(), '${token_split[0]}.${token_split[1]}'.bytes(),
		sha256.sum, sha256.block_size)
	signature_from_token := base64.url_decode(token_split[2])
	return hmac.equal(signature_from_token, signature_mirror)
}