1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
extern crate hex;
extern crate urlencoding;
use std::collections::HashMap;
use std::net::IpAddr;
use chrono::{DateTime, Utc};
use sha2::{Sha256, Digest};
use sha1::{Sha1};
enum Version {
V1,
V2,
Hybrid
}
struct Torrent {
name: String,
sha1: [u8; 20],
sha256: [u8; 32],
version: Version,
files: HashMap<String, u64>,
source: IpAddr,
date: DateTime<Utc>,
hostname: String,
software: String
}
impl Torrent {
fn magnet(&self) -> String {
let mut string = String::from("magnet:?dn=");
string.push_str(&urlencoding::encode(&self.name));
if matches!(self.version, Version::V1) || matches!(self.version, Version::Hybrid) {
string.push_str("&xt=urn:btih:");
string.push_str(&hex::encode(&self.sha1));
}
if matches!(self.version, Version::V2) || matches!(self.version, Version::Hybrid) {
string.push_str("&xt=urn:btmh:1220");
string.push_str(&hex::encode(&self.sha256));
}
string
}
}
fn main() {
let hash2 = Sha256::new().chain_update(b"test").finalize();
let hash1 = Sha1::new().chain_update(b"test").finalize();
println!("Hello, world! {:#?} {:#?}", hash2, hash1);
}
|