Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-cryptography for 
openSUSE:Factory checked in at 2026-03-28 20:12:17
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-cryptography (Old)
 and      /work/SRC/openSUSE:Factory/.python-cryptography.new.8177 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-cryptography"

Sat Mar 28 20:12:17 2026 rev:108 rq:1343139 version:46.0.6

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-cryptography/python-cryptography.changes  
2026-02-14 21:36:49.391424184 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-cryptography.new.8177/python-cryptography.changes
        2026-03-28 20:12:20.218912026 +0100
@@ -1,0 +2,11 @@
+Fri Mar 27 09:11:38 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 46.0.6 (CVE-2026-34073, bsc#1260876):
+  * SECURITY ISSUE: Fixed a bug where name constraints were not
+    applied to peer names during verification when the leaf
+    certificate contains a wildcard DNS SAN. Ordinary X.509
+    topologies are not affected by this bug, including those used
+    by the Web PKI. Credit to Oleh Konko (1seal) for reporting
+    the issue. CVE-2026-34073
+
+-------------------------------------------------------------------

Old:
----
  cryptography-46.0.5.tar.gz

New:
----
  cryptography-46.0.6.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-cryptography.spec ++++++
--- /var/tmp/diff_new_pack.86SeQ4/_old  2026-03-28 20:12:21.206952754 +0100
+++ /var/tmp/diff_new_pack.86SeQ4/_new  2026-03-28 20:12:21.206952754 +0100
@@ -28,7 +28,7 @@
 %{?sle15_python_module_pythons}
 Name:           python-cryptography%{psuffix}
 # ALWAYS KEEP IN SYNC WITH python-cryptography-vectors!
-Version:        46.0.5
+Version:        46.0.6
 Release:        0
 Summary:        Python library which exposes cryptographic recipes and 
primitives
 License:        Apache-2.0 OR BSD-3-Clause

++++++ cryptography-46.0.5.tar.gz -> cryptography-46.0.6.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cryptography-46.0.5/CHANGELOG.rst 
new/cryptography-46.0.6/CHANGELOG.rst
--- old/cryptography-46.0.5/CHANGELOG.rst       2026-02-10 20:11:41.000000000 
+0100
+++ new/cryptography-46.0.6/CHANGELOG.rst       2026-03-26 00:26:23.000000000 
+0100
@@ -3,6 +3,15 @@
 
 .. _v46-0-5:
 
+46.0.6 - 2026-03-25
+~~~~~~~~~~~~~~~~~~~
+
+* **SECURITY ISSUE**: Fixed a bug where name constraints were not applied
+  to peer names during verification when the leaf certificate contains a
+  wildcard DNS SAN. Ordinary X.509 topologies are not affected by this bug,
+  including those used by the Web PKI. Credit to **Oleh Konko (1seal)** for
+  reporting the issue. **CVE-2026-34073**
+
 46.0.5 - 2026-02-10
 ~~~~~~~~~~~~~~~~~~~
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cryptography-46.0.5/PKG-INFO 
new/cryptography-46.0.6/PKG-INFO
--- old/cryptography-46.0.5/PKG-INFO    1970-01-01 01:00:00.000000000 +0100
+++ new/cryptography-46.0.6/PKG-INFO    1970-01-01 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: cryptography
-Version: 46.0.5
+Version: 46.0.6
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Intended Audience :: Developers
 Classifier: Natural Language :: English
@@ -28,7 +28,7 @@
 Requires-Dist: typing-extensions>=4.13.2 ; python_full_version < '3.11'
 Requires-Dist: bcrypt>=3.1.5 ; extra == 'ssh'
 Requires-Dist: nox[uv]>=2024.4.15 ; extra == 'nox'
-Requires-Dist: cryptography-vectors==46.0.5 ; extra == 'test'
+Requires-Dist: cryptography-vectors==46.0.6 ; extra == 'test'
 Requires-Dist: pytest>=7.4.0 ; extra == 'test'
 Requires-Dist: pytest-benchmark>=4.0 ; extra == 'test'
 Requires-Dist: pytest-cov>=2.10.1 ; extra == 'test'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cryptography-46.0.5/pyproject.toml 
new/cryptography-46.0.6/pyproject.toml
--- old/cryptography-46.0.5/pyproject.toml      2026-02-10 20:11:41.000000000 
+0100
+++ new/cryptography-46.0.6/pyproject.toml      2026-03-26 00:26:23.000000000 
+0100
@@ -16,7 +16,7 @@
 
 [project]
 name = "cryptography"
-version = "46.0.5"
+version = "46.0.6"
 authors = [
     { name = "The Python Cryptographic Authority and individual contributors", 
email = "[email protected]" },
 ]
@@ -70,7 +70,7 @@
 # All the following are used for our own testing.
 nox = ["nox[uv] >=2024.04.15"]
 test = [
-    "cryptography_vectors==46.0.5",
+    "cryptography_vectors==46.0.6",
     "pytest >=7.4.0",
     "pytest-benchmark >=4.0",
     "pytest-cov >=2.10.1",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cryptography-46.0.5/src/cryptography/__about__.py 
new/cryptography-46.0.6/src/cryptography/__about__.py
--- old/cryptography-46.0.5/src/cryptography/__about__.py       2026-02-10 
20:11:41.000000000 +0100
+++ new/cryptography-46.0.6/src/cryptography/__about__.py       2026-03-26 
00:26:23.000000000 +0100
@@ -10,7 +10,7 @@
     "__version__",
 ]
 
-__version__ = "46.0.5"
+__version__ = "46.0.6"
 
 
 __author__ = "The Python Cryptographic Authority and individual contributors"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/cryptography-46.0.5/src/rust/cryptography-x509-verification/src/lib.rs 
new/cryptography-46.0.6/src/rust/cryptography-x509-verification/src/lib.rs
--- old/cryptography-46.0.5/src/rust/cryptography-x509-verification/src/lib.rs  
2026-02-10 20:11:41.000000000 +0100
+++ new/cryptography-46.0.6/src/rust/cryptography-x509-verification/src/lib.rs  
2026-03-26 00:26:23.000000000 +0100
@@ -162,9 +162,7 @@
                 // match exactly one subdomain of `foo.com`. Therefore, the 
NC's matching
                 // set is a strict superset of any possible wildcard SAN 
pattern.
                 match (DNSConstraint::new(constraint.0), 
DNSPattern::new(name.0)) {
-                    (Some(constraint), Some(name)) => {
-                        Ok(Applied(constraint.matches(name.inner_name())))
-                    }
+                    (Some(constraint), Some(name)) => 
Ok(Applied(constraint.matches(&name))),
                     (_, None) => 
Err(ValidationError::new(ValidationErrorKind::Other(format!(
                         "unsatisfiable DNS name constraint: malformed SAN {}",
                         name.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/cryptography-46.0.5/src/rust/cryptography-x509-verification/src/types.rs 
new/cryptography-46.0.6/src/rust/cryptography-x509-verification/src/types.rs
--- 
old/cryptography-46.0.5/src/rust/cryptography-x509-verification/src/types.rs    
    2026-02-10 20:11:41.000000000 +0100
+++ 
new/cryptography-46.0.6/src/rust/cryptography-x509-verification/src/types.rs    
    2026-03-26 00:26:23.000000000 +0100
@@ -138,19 +138,6 @@
             },
         }
     }
-
-    /// Returns the inner `DNSName` within this `DNSPattern`, e.g.
-    /// `foo.com` for `*.foo.com` or `example.com` for `example.com`.
-    ///
-    /// This API must not be used to bypass pattern matching; it exists
-    /// solely to enable checks that only require the inner name, such
-    /// as Name Constraint checks.
-    pub fn inner_name(&self) -> &DNSName<'a> {
-        match self {
-            DNSPattern::Exact(dnsname) => dnsname,
-            DNSPattern::Wildcard(dnsname) => dnsname,
-        }
-    }
 }
 
 /// A `DNSConstraint` represents a DNS name constraint as defined in [RFC 5280 
4.2.1.10].
@@ -163,35 +150,45 @@
         DNSName::new(pattern).map(Self)
     }
 
-    /// Returns true if this `DNSConstraint` matches the given name.
+    /// Returns true if this `DNSConstraint` matches the given `DNSPattern`.
     ///
     /// Constraint matching is defined by RFC 5280: any DNS name that can
     /// be constructed by simply adding zero or more labels to the left-hand
     /// side of the name satisfies the name constraint.
     ///
-    /// ```rust
-    /// # use cryptography_x509_verification::types::{DNSConstraint, DNSName};
-    /// let example_com = DNSName::new("example.com").unwrap();
-    /// let badexample_com = DNSName::new("badexample.com").unwrap();
-    /// let foo_example_com = DNSName::new("foo.example.com").unwrap();
-    /// 
assert!(DNSConstraint::new(example_com.as_str()).unwrap().matches(&example_com));
-    /// 
assert!(DNSConstraint::new(example_com.as_str()).unwrap().matches(&foo_example_com));
-    /// 
assert!(!DNSConstraint::new(example_com.as_str()).unwrap().matches(&badexample_com));
-    /// ```
-    pub fn matches(&self, name: &DNSName<'_>) -> bool {
-        // NOTE: This may seem like an obtuse way to perform label matching,
-        // but it saves us a few allocations: doing a substring check instead
-        // would require us to clone each string and do case normalization.
-        // Note also that we check the length in advance: Rust's zip
-        // implementation terminates with the shorter iterator, so we need
-        // to first check that the candidate name is at least as long as
-        // the constraint it's matching against.
-        name.as_str().len() >= self.0.as_str().len()
-            && self
-                .0
-                .rlabels()
-                .zip(name.rlabels())
-                .all(|(a, o)| a.eq_ignore_ascii_case(o))
+    /// On top of what RFC 5280 specifies, we define behavior for wildcard
+    /// patterns (which are not covered by RFC 5280): a wildcard pattern
+    /// matches a constraint if the pattern matches the constraint's inner 
name,
+    /// _or_ if the pattern's inner name matches the constraint.
+    /// This allows us to reject DNS names like `*.example.com` when
+    /// the constraint is `example.com` or `bar.example.com`.
+    pub fn matches(&self, name: &DNSPattern<'_>) -> bool {
+        match name {
+            DNSPattern::Exact(name) => {
+                // NOTE: This may seem like an obtuse way to perform label 
matching,
+                // but it saves us a few allocations: doing a substring check 
instead
+                // would require us to clone each string and do case 
normalization.
+                // Note also that we check the length in advance: Rust's zip
+                // implementation terminates with the shorter iterator, so we 
need
+                // to first check that the candidate name is at least as long 
as
+                // the constraint it's matching against.
+                name.as_str().len() >= self.0.as_str().len()
+                    && self
+                        .0
+                        .rlabels()
+                        .zip(name.rlabels())
+                        .all(|(a, o)| a.eq_ignore_ascii_case(o))
+            }
+            DNSPattern::Wildcard(inner) => {
+                // NOTE: This check is not as simple as a single pattern match,
+                // since we need two subtly distinct cases here:
+                // 1. Constraint `bar.example.com` on `*.example.com`
+                // 2. Constraint `example.com` on `*.example.com`
+                // The first cases is handled by `DNSPattern::matches`, and 
the second is handled
+                // by `DNSConstraint::matches`.
+                name.matches(&self.0) || 
self.matches(&DNSPattern::Exact(inner.clone()))
+            }
+        }
     }
 }
 
@@ -597,14 +594,33 @@
         let example_com = DNSConstraint::new("example.com").unwrap();
 
         // Exact domain and arbitrary subdomains match.
-        assert!(example_com.matches(&DNSName::new("example.com").unwrap()));
-        
assert!(example_com.matches(&DNSName::new("foo.example.com").unwrap()));
-        
assert!(example_com.matches(&DNSName::new("foo.bar.baz.quux.example.com").unwrap()));
+        assert!(example_com.matches(&DNSPattern::new("example.com").unwrap()));
+        
assert!(example_com.matches(&DNSPattern::new("foo.example.com").unwrap()));
+        
assert!(example_com.matches(&DNSPattern::new("foo.bar.baz.quux.example.com").unwrap()));
 
         // Parent domains, distinct domains, and substring domains do not 
match.
-        assert!(!example_com.matches(&DNSName::new("com").unwrap()));
-        
assert!(!example_com.matches(&DNSName::new("badexample.com").unwrap()));
-        assert!(!example_com.matches(&DNSName::new("wrong.com").unwrap()));
+        assert!(!example_com.matches(&DNSPattern::new("com").unwrap()));
+        
assert!(!example_com.matches(&DNSPattern::new("badexample.com").unwrap()));
+        assert!(!example_com.matches(&DNSPattern::new("wrong.com").unwrap()));
+    }
+
+    #[test]
+    fn test_dnsconstraint_matches_wildcard() {
+        let com = DNSConstraint::new("com").unwrap();
+        let example_com = DNSConstraint::new("example.com").unwrap();
+        let bar_example_com = DNSConstraint::new("bar.example.com").unwrap();
+        let baz_bar_example_com = 
DNSConstraint::new("baz.bar.example.com").unwrap();
+        let any_example_com = DNSPattern::new("*.example.com").unwrap();
+
+        assert!(com.matches(&any_example_com));
+        assert!(example_com.matches(&any_example_com));
+        assert!(bar_example_com.matches(&any_example_com));
+
+        // A constraint on `baz.bar.example.com` doesn't match `*.example.com`,
+        // since `baz.bar.example.com` matches zero or more sublabels of
+        // `baz.bar.example.com` while `*.example.com` matches exactly one
+        // sublabel of `example.com`.
+        assert!(!baz_bar_example_com.matches(&any_example_com));
     }
 
     #[test]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/cryptography-46.0.5/tests/x509/verification/test_limbo.py 
new/cryptography-46.0.6/tests/x509/verification/test_limbo.py
--- old/cryptography-46.0.5/tests/x509/verification/test_limbo.py       
2026-02-10 20:11:41.000000000 +0100
+++ new/cryptography-46.0.6/tests/x509/verification/test_limbo.py       
2026-03-26 00:26:23.000000000 +0100
@@ -85,6 +85,16 @@
     # with what webpki and rustls do, but inconsistent with Go and OpenSSL.
     "rfc5280::ca-as-leaf",
     "pathlen::validation-ignores-pathlen-in-leaf",
+    # These CABF SAN/CN mismatch tests are pretty niche.
+    "webpki::cn::ipv4-hex-mismatch",
+    "webpki::cn::ipv4-leading-zeros-mismatch",
+    "webpki::cn::ipv6-uppercase-mismatch",
+    "webpki::cn::ipv6-uncompressed-mismatch",
+    "webpki::cn::ipv6-non-rfc5952-mismatch",
+    "webpki::cn::punycode-not-in-san",
+    "webpki::cn::utf8-vs-punycode-mismatch",
+    "webpki::cn::not-in-san",
+    "webpki::cn::case-mismatch",
 }
 
 

++++++ no-pytest_benchmark.patch ++++++
--- /var/tmp/diff_new_pack.86SeQ4/_old  2026-03-28 20:12:21.646970892 +0100
+++ /var/tmp/diff_new_pack.86SeQ4/_new  2026-03-28 20:12:21.650971057 +0100
@@ -1,10 +1,10 @@
-Index: cryptography-46.0.5/pyproject.toml
+Index: cryptography-46.0.6/pyproject.toml
 ===================================================================
---- cryptography-46.0.5.orig/pyproject.toml
-+++ cryptography-46.0.5/pyproject.toml
+--- cryptography-46.0.6.orig/pyproject.toml
++++ cryptography-46.0.6/pyproject.toml
 @@ -72,8 +72,6 @@ nox = ["nox[uv] >=2024.04.15"]
  test = [
-     "cryptography_vectors==46.0.5",
+     "cryptography_vectors==46.0.6",
      "pytest >=7.4.0",
 -    "pytest-benchmark >=4.0",
 -    "pytest-cov >=2.10.1",
@@ -51,10 +51,10 @@
  [tool.ruff]
  line-length = 79
  
-Index: cryptography-46.0.5/tests/bench/test_aead.py
+Index: cryptography-46.0.6/tests/bench/test_aead.py
 ===================================================================
---- cryptography-46.0.5.orig/tests/bench/test_aead.py
-+++ cryptography-46.0.5/tests/bench/test_aead.py
+--- cryptography-46.0.6.orig/tests/bench/test_aead.py
++++ cryptography-46.0.6/tests/bench/test_aead.py
 @@ -26,84 +26,84 @@ def _aead_supported(cls):
      not _aead_supported(ChaCha20Poly1305),
      reason="Requires OpenSSL with ChaCha20Poly1305 support",
@@ -160,10 +160,10 @@
      ct = aes.encrypt(b"\x00" * 12, b"hello world plaintext", None)
 -    benchmark(aes.decrypt, b"\x00" * 12, ct, None)
 +    aes.decrypt(b"\x00" * 12, ct, None)
-Index: cryptography-46.0.5/tests/bench/test_ec_load.py
+Index: cryptography-46.0.6/tests/bench/test_ec_load.py
 ===================================================================
---- cryptography-46.0.5.orig/tests/bench/test_ec_load.py
-+++ cryptography-46.0.5/tests/bench/test_ec_load.py
+--- cryptography-46.0.6.orig/tests/bench/test_ec_load.py
++++ cryptography-46.0.6/tests/bench/test_ec_load.py
 @@ -5,9 +5,9 @@
  from ..hazmat.primitives.fixtures_ec import EC_KEY_SECP256R1
  
@@ -178,10 +178,10 @@
 -    benchmark(EC_KEY_SECP256R1.private_key)
 +def test_load_ec_private_numbers():
 +    EC_KEY_SECP256R1.private_key()
-Index: cryptography-46.0.5/tests/bench/test_hashes.py
+Index: cryptography-46.0.6/tests/bench/test_hashes.py
 ===================================================================
---- cryptography-46.0.5.orig/tests/bench/test_hashes.py
-+++ cryptography-46.0.5/tests/bench/test_hashes.py
+--- cryptography-46.0.6.orig/tests/bench/test_hashes.py
++++ cryptography-46.0.6/tests/bench/test_hashes.py
 @@ -5,10 +5,10 @@
  from cryptography.hazmat.primitives import hashes
  
@@ -195,10 +195,10 @@
  
 -    benchmark(bench)
 +    bench()
-Index: cryptography-46.0.5/tests/bench/test_hmac.py
+Index: cryptography-46.0.6/tests/bench/test_hmac.py
 ===================================================================
---- cryptography-46.0.5.orig/tests/bench/test_hmac.py
-+++ cryptography-46.0.5/tests/bench/test_hmac.py
+--- cryptography-46.0.6.orig/tests/bench/test_hmac.py
++++ cryptography-46.0.6/tests/bench/test_hmac.py
 @@ -5,10 +5,10 @@
  from cryptography.hazmat.primitives import hashes, hmac
  
@@ -212,10 +212,10 @@
  
 -    benchmark(bench)
 +    bench()
-Index: cryptography-46.0.5/tests/bench/test_x509.py
+Index: cryptography-46.0.6/tests/bench/test_x509.py
 ===================================================================
---- cryptography-46.0.5.orig/tests/bench/test_x509.py
-+++ cryptography-46.0.5/tests/bench/test_x509.py
+--- cryptography-46.0.6.orig/tests/bench/test_x509.py
++++ cryptography-46.0.6/tests/bench/test_x509.py
 @@ -13,40 +13,40 @@ from cryptography import x509
  from ..utils import load_vectors_from_file
  

++++++ vendor.tar.zst ++++++
++++ 576540 lines of diff (skipped)

Reply via email to