[symm] update to 2286d8c17e5bf3d4312357eba9a845262068f007
This commit is contained in:
parent
3ef626596e
commit
e384f11e02
34
symm.rs
34
symm.rs
|
|
@ -1,7 +1,11 @@
|
||||||
|
use std;
|
||||||
|
|
||||||
import core::ptr;
|
import core::ptr;
|
||||||
import core::str;
|
import core::str;
|
||||||
import core::vec;
|
import core::vec;
|
||||||
|
|
||||||
|
import ctypes::c_int;
|
||||||
|
|
||||||
export crypter;
|
export crypter;
|
||||||
export cryptermode;
|
export cryptermode;
|
||||||
export encryptmode, decryptmode;
|
export encryptmode, decryptmode;
|
||||||
|
|
@ -18,7 +22,7 @@ native mod _native {
|
||||||
type EVP_CIPHER;
|
type EVP_CIPHER;
|
||||||
|
|
||||||
fn EVP_CIPHER_CTX_new() -> EVP_CIPHER_CTX;
|
fn EVP_CIPHER_CTX_new() -> EVP_CIPHER_CTX;
|
||||||
fn EVP_CIPHER_CTX_set_padding(ctx: EVP_CIPHER_CTX, padding: int);
|
fn EVP_CIPHER_CTX_set_padding(ctx: EVP_CIPHER_CTX, padding: c_int);
|
||||||
|
|
||||||
fn EVP_aes_128_ecb() -> EVP_CIPHER;
|
fn EVP_aes_128_ecb() -> EVP_CIPHER;
|
||||||
fn EVP_aes_128_cbc() -> EVP_CIPHER;
|
fn EVP_aes_128_cbc() -> EVP_CIPHER;
|
||||||
|
|
@ -28,7 +32,7 @@ native mod _native {
|
||||||
fn EVP_aes_256_cbc() -> EVP_CIPHER;
|
fn EVP_aes_256_cbc() -> EVP_CIPHER;
|
||||||
|
|
||||||
fn EVP_CipherInit(ctx: EVP_CIPHER_CTX, evp: EVP_CIPHER,
|
fn EVP_CipherInit(ctx: EVP_CIPHER_CTX, evp: EVP_CIPHER,
|
||||||
key: *u8, iv: *u8, mode: int);
|
key: *u8, iv: *u8, mode: c_int);
|
||||||
fn EVP_CipherUpdate(ctx: EVP_CIPHER_CTX, outbuf: *u8, outlen: *u32,
|
fn EVP_CipherUpdate(ctx: EVP_CIPHER_CTX, outbuf: *u8, outlen: *u32,
|
||||||
inbuf: *u8, inlen: u32);
|
inbuf: *u8, inlen: u32);
|
||||||
fn EVP_CipherFinal(ctx: EVP_CIPHER_CTX, res: *u8, len: *u32);
|
fn EVP_CipherFinal(ctx: EVP_CIPHER_CTX, res: *u8, len: *u32);
|
||||||
|
|
@ -39,7 +43,7 @@ Object: crypter
|
||||||
|
|
||||||
Represents a symmetric cipher context.
|
Represents a symmetric cipher context.
|
||||||
*/
|
*/
|
||||||
type crypter = obj {
|
iface crypter {
|
||||||
/*
|
/*
|
||||||
Method: pad
|
Method: pad
|
||||||
|
|
||||||
|
|
@ -69,7 +73,7 @@ type crypter = obj {
|
||||||
Finish crypting. Returns the remaining partial block of output, if any.
|
Finish crypting. Returns the remaining partial block of output, if any.
|
||||||
*/
|
*/
|
||||||
fn final() -> [u8];
|
fn final() -> [u8];
|
||||||
};
|
}
|
||||||
|
|
||||||
tag cryptermode {
|
tag cryptermode {
|
||||||
encryptmode;
|
encryptmode;
|
||||||
|
|
@ -96,37 +100,37 @@ fn mk_crypter(t: cryptertype) -> crypter {
|
||||||
blocksize: uint
|
blocksize: uint
|
||||||
};
|
};
|
||||||
|
|
||||||
obj crypter(st: crypterstate) {
|
impl of crypter for crypterstate {
|
||||||
fn pad(padding: bool) {
|
fn pad(padding: bool) {
|
||||||
let v = padding ? 1 : 0;
|
let v = (padding ? 1 : 0) as c_int;
|
||||||
_native::EVP_CIPHER_CTX_set_padding(st.ctx, v);
|
_native::EVP_CIPHER_CTX_set_padding(self.ctx, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn init (mode: cryptermode, key: [u8], iv: [u8]) unsafe {
|
fn init (mode: cryptermode, key: [u8], iv: [u8]) unsafe {
|
||||||
let m = alt mode { encryptmode. { 1 } decryptmode. { 0 } };
|
let m = alt mode { encryptmode. { 1 } decryptmode. { 0 } } as c_int;
|
||||||
assert(vec::len(key) == st.keylen);
|
assert(vec::len(key) == self.keylen);
|
||||||
let pkey: *u8 = vec::unsafe::to_ptr::<u8>(key);
|
let pkey: *u8 = vec::unsafe::to_ptr::<u8>(key);
|
||||||
let piv: *u8 = vec::unsafe::to_ptr::<u8>(iv);
|
let piv: *u8 = vec::unsafe::to_ptr::<u8>(iv);
|
||||||
_native::EVP_CipherInit(st.ctx, st.evp, pkey, piv, m);
|
_native::EVP_CipherInit(self.ctx, self.evp, pkey, piv, m);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update(data: [u8]) -> [u8] unsafe {
|
fn update(data: [u8]) -> [u8] unsafe {
|
||||||
let pdata: *u8 = vec::unsafe::to_ptr::<u8>(data);
|
let pdata: *u8 = vec::unsafe::to_ptr::<u8>(data);
|
||||||
let datalen: u32 = vec::len(data) as u32;
|
let datalen: u32 = vec::len(data) as u32;
|
||||||
let reslen: u32 = datalen + (st.blocksize as u32);
|
let reslen: u32 = datalen + (self.blocksize as u32);
|
||||||
let preslen: *u32 = ptr::addr_of(reslen);
|
let preslen: *u32 = ptr::addr_of(reslen);
|
||||||
let res: [mutable u8] = vec::init_elt_mut::<u8>(0u8, reslen as uint);
|
let res: [mutable u8] = vec::init_elt_mut::<u8>(0u8, reslen as uint);
|
||||||
let pres: *u8 = vec::unsafe::to_ptr::<u8>(res);
|
let pres: *u8 = vec::unsafe::to_ptr::<u8>(res);
|
||||||
_native::EVP_CipherUpdate(st.ctx, pres, preslen, pdata, datalen);
|
_native::EVP_CipherUpdate(self.ctx, pres, preslen, pdata, datalen);
|
||||||
ret vec::slice::<u8>(res, 0u, *preslen as uint);
|
ret vec::slice::<u8>(res, 0u, *preslen as uint);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn final() -> [u8] unsafe {
|
fn final() -> [u8] unsafe {
|
||||||
let reslen: u32 = st.blocksize as u32;
|
let reslen: u32 = self.blocksize as u32;
|
||||||
let preslen: *u32 = ptr::addr_of(reslen);
|
let preslen: *u32 = ptr::addr_of(reslen);
|
||||||
let res: [mutable u8] = vec::init_elt_mut::<u8>(0u8, reslen as uint);
|
let res: [mutable u8] = vec::init_elt_mut::<u8>(0u8, reslen as uint);
|
||||||
let pres: *u8 = vec::unsafe::to_ptr::<u8>(res);
|
let pres: *u8 = vec::unsafe::to_ptr::<u8>(res);
|
||||||
_native::EVP_CipherFinal(st.ctx, pres, preslen);
|
_native::EVP_CipherFinal(self.ctx, pres, preslen);
|
||||||
ret vec::slice::<u8>(res, 0u, *preslen as uint);
|
ret vec::slice::<u8>(res, 0u, *preslen as uint);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -134,7 +138,7 @@ fn mk_crypter(t: cryptertype) -> crypter {
|
||||||
let ctx = _native::EVP_CIPHER_CTX_new();
|
let ctx = _native::EVP_CIPHER_CTX_new();
|
||||||
let (evp, keylen, blocksz) = evpc(t);
|
let (evp, keylen, blocksz) = evpc(t);
|
||||||
let st = { evp: evp, ctx: ctx, keylen: keylen, blocksize: blocksz };
|
let st = { evp: evp, ctx: ctx, keylen: keylen, blocksize: blocksz };
|
||||||
let h = crypter(st);
|
let h = st as crypter;
|
||||||
ret h;
|
ret h;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue