Skip to content

Commit e12f2a4

Browse files
authored
srp: deprecate G1024 and G1536 (#246)
These groups are smaller than 2048-bits, which makes them too small to be secure. This preserves them (several of our tests reference them) but adds a deprecation warning.
1 parent 52ef2be commit e12f2a4

File tree

6 files changed

+59
-18
lines changed

6 files changed

+59
-18
lines changed

srp/src/client.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@ use digest::{Digest, Output};
66
use subtle::ConstantTimeEq;
77

88
/// SRP client configured with a standard 1024-bit group.
9+
#[deprecated(since = "0.7.0", note = "too small to be secure; use a larger group")]
10+
#[allow(deprecated)]
911
pub type ClientG1024<D> = Client<G1024, D>;
1012
/// SRP client configured with a standard 1536-bit group.
13+
#[deprecated(since = "0.7.0", note = "too small to be secure; use a larger group")]
14+
#[allow(deprecated)]
1115
pub type ClientG1536<D> = Client<G1536, D>;
1216
/// SRP client configured with a standard 2048-bit group.
1317
pub type ClientG2048<D> = Client<G2048, D>;

srp/src/groups.rs

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
//! Groups from [RFC5054](https://tools.ietf.org/html/rfc5054)
1+
//! Groups from [RFC5054].
22
//!
3-
//! It is strongly recommended to use them instead of custom generated
4-
//! groups. Additionally, it is not recommended to use `G1024` and `G1536`,
3+
//! It is strongly recommended to use them instead of custom generated groups.
4+
//!
5+
//! Additionally, it is NOT recommended to use [`G1024`] and [`G1536`],
56
//! they are provided only for compatibility with the legacy software.
7+
//!
8+
//! [RFC5054]: https://tools.ietf.org/html/rfc5054
69
710
use core::{
811
any,
@@ -35,12 +38,39 @@ macro_rules! define_group {
3538
#[doc = $doc]
3639
#[derive(Clone, Copy)]
3740
pub struct $name;
41+
group_trait_impls!($name, $g, $n);
42+
};
43+
}
44+
45+
macro_rules! define_deprecated_group {
46+
($name:ident, $g:expr, $n:expr, $doc:expr) => {
47+
/// DEPRECATED:
48+
#[doc = $doc]
49+
///
50+
/// <div class="warning">
51+
/// <b>Warning: small group size!</b>
52+
///
53+
/// It is recommended to use a group which is 2048-bits or larger.
54+
/// </div>
55+
#[derive(Clone, Copy)]
56+
#[deprecated(
57+
since = "0.7.0",
58+
note = "this group is too small to be secure. Prefer to use G2048+"
59+
)]
60+
pub struct $name;
61+
group_trait_impls!($name, $g, $n);
62+
};
63+
}
3864

65+
macro_rules! group_trait_impls {
66+
($name:ident, $g:expr, $n:expr) => {
67+
#[allow(deprecated)]
3968
impl Group for $name {
4069
const G: u64 = $g;
41-
const N: &'static [u8] = include_bytes!("groups/1024.bin");
70+
const N: &'static [u8] = include_bytes!($n);
4271
}
4372

73+
#[allow(deprecated)]
4474
impl Debug for $name {
4575
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
4676
let name = any::type_name::<$name>();
@@ -54,6 +84,7 @@ macro_rules! define_group {
5484
}
5585
}
5686

87+
#[allow(deprecated)]
5788
impl<Rhs: Group> PartialEq<Rhs> for $name {
5889
fn eq(&self, _other: &Rhs) -> bool {
5990
Self::G == Rhs::G && Self::N == Rhs::N
@@ -62,13 +93,14 @@ macro_rules! define_group {
6293
};
6394
}
6495

65-
define_group!(G1024, 2, "groups/1024.bin", "1024-bit group.");
66-
define_group!(G1536, 2, "groups/1536.bin", "1536-bit group.");
96+
define_deprecated_group!(G1024, 2, "groups/1024.bin", "1024-bit group.");
97+
define_deprecated_group!(G1536, 2, "groups/1536.bin", "1536-bit group.");
6798
define_group!(G2048, 2, "groups/2048.bin", "2048-bit group.");
6899
define_group!(G3072, 5, "groups/3072.bin", "3072-bit group.");
69100
define_group!(G4096, 5, "groups/4096.bin", "4096-bit group.");
70101

71102
#[cfg(test)]
103+
#[allow(deprecated)]
72104
mod tests {
73105
use super::{G1024, Group};
74106
use crate::utils::compute_k;

srp/src/lib.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,13 @@ mod client;
7878
mod errors;
7979
mod server;
8080

81-
pub use client::{
82-
Client, ClientG1024, ClientG1536, ClientG2048, ClientG3072, ClientG4096, ClientVerifier,
83-
};
81+
pub use client::{Client, ClientG2048, ClientG3072, ClientG4096, ClientVerifier};
8482
pub use errors::AuthError;
8583
pub use groups::Group;
86-
pub use server::{
87-
Server, ServerG1024, ServerG1536, ServerG2048, ServerG3072, ServerG4096, ServerVerifier,
88-
};
84+
pub use server::{Server, ServerG2048, ServerG3072, ServerG4096, ServerVerifier};
8985

9086
#[allow(deprecated)]
91-
pub use {client::LegacyClientVerifier, server::LegacyServerVerifier};
87+
pub use {
88+
client::{ClientG1024, ClientG1536, LegacyClientVerifier},
89+
server::{LegacyServerVerifier, ServerG1024, ServerG1536},
90+
};

srp/src/server.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@ use digest::{Digest, Output};
66
use subtle::ConstantTimeEq;
77

88
/// SRP server configured with a standard [`G1024`] group.
9+
#[deprecated(since = "0.7.0", note = "too small to be secure; use a larger group")]
10+
#[allow(deprecated)]
911
pub type ServerG1024<D> = Server<G1024, D>;
1012
/// SRP server configured with a standard [`G1536`] group.
13+
#[deprecated(since = "0.7.0", note = "too small to be secure; use a larger group")]
14+
#[allow(deprecated)]
1115
pub type ServerG1536<D> = Server<G1536, D>;
1216
/// SRP server configured with a standard [`G2048`] group.
1317
pub type ServerG2048<D> = Server<G2048, D>;

srp/tests/bad_public.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use crypto_bigint::BoxedUint;
22
use sha1::Sha1;
3-
use srp::{Client, Server, groups::G1024};
3+
use srp::{ClientG2048, ServerG2048};
44

55
#[test]
66
#[should_panic]
77
fn bad_a_pub() {
8-
let server = Server::<G1024, Sha1>::new();
8+
let server = ServerG2048::<Sha1>::new();
99
server
1010
.process_reply(b"", b"", b"", b"", &BoxedUint::zero().to_be_bytes())
1111
.unwrap();
@@ -14,7 +14,7 @@ fn bad_a_pub() {
1414
#[test]
1515
#[should_panic]
1616
fn bad_b_pub() {
17-
let client = Client::<G1024, Sha1>::new();
17+
let client = ClientG2048::<Sha1>::new();
1818
client
1919
.process_reply(b"", b"", b"", b"", &BoxedUint::zero().to_be_bytes())
2020
.unwrap();

srp/tests/rfc5054.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ use crypto_bigint::BoxedUint;
22
use hex_literal::hex;
33
use sha1::Sha1;
44
use srp::utils::{compute_k, compute_u};
5-
use srp::{Client, Group, Server, groups::G1024};
5+
use srp::{Client, Group, Server};
66

77
#[test]
8-
#[allow(clippy::many_single_char_names)]
8+
#[allow(clippy::many_single_char_names, deprecated)]
99
fn rfc5054() {
10+
use srp::groups::G1024;
11+
1012
let i = b"alice";
1113
let p = b"password123";
1214
let s = hex!("BEB25379 D1A8581E B5A72767 3A2441EE");

0 commit comments

Comments
 (0)