parent
15b40bc1b9
commit
2519b7dfdb
@ -1,4 +1,2 @@
|
|||||||
SOURCES/maxim.key
|
|
||||||
SOURCES/mdounin.key
|
|
||||||
SOURCES/nginx-1.20.1.tar.gz
|
SOURCES/nginx-1.20.1.tar.gz
|
||||||
SOURCES/sb.key
|
SOURCES/nginx-logo.png
|
||||||
|
@ -1,4 +1,2 @@
|
|||||||
fe1bb3869c51a54f28e7e7a2c1d8a790a2ca7789 SOURCES/maxim.key
|
|
||||||
145bf87154a2689f7c09a376c11f307012a439de SOURCES/mdounin.key
|
|
||||||
6b4ab4eff3c617e133819f43fdfc14708e593a79 SOURCES/nginx-1.20.1.tar.gz
|
6b4ab4eff3c617e133819f43fdfc14708e593a79 SOURCES/nginx-1.20.1.tar.gz
|
||||||
baa71c22e4e2b67be2a5f4f4df25a99962488f90 SOURCES/sb.key
|
e28dd656984cc2894d8124c5278789c656f6a9cb SOURCES/nginx-logo.png
|
||||||
|
@ -0,0 +1,74 @@
|
|||||||
|
From b6aa9504cdfb6391d895dcbddc87b9260ea6968c Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Lubo=C5=A1=20Uhliarik?= <luhliari@redhat.com>
|
||||||
|
Date: Wed, 11 Oct 2023 09:59:23 +0200
|
||||||
|
Subject: [PATCH] CVE-2023-44487 - HTTP/2: per-iteration stream handling limit.
|
||||||
|
|
||||||
|
To ensure that attempts to flood servers with many streams are detected
|
||||||
|
early, a limit of no more than 2 * max_concurrent_streams new streams per one
|
||||||
|
event loop iteration was introduced. This limit is applied even if
|
||||||
|
max_concurrent_streams is not yet reached - for example, if corresponding
|
||||||
|
streams are handled synchronously or reset.
|
||||||
|
|
||||||
|
Further, refused streams are now limited to maximum of max_concurrent_streams
|
||||||
|
and 100, similarly to priority_limit initial value, providing some tolerance
|
||||||
|
to clients trying to open several streams at the connection start, yet
|
||||||
|
low tolerance to flooding attempts.
|
||||||
|
---
|
||||||
|
src/http/v2/ngx_http_v2.c | 15 +++++++++++++++
|
||||||
|
src/http/v2/ngx_http_v2.h | 2 ++
|
||||||
|
2 files changed, 17 insertions(+)
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/src/http/v2/ngx_http_v2.c b/src/http/v2/ngx_http_v2.c
|
||||||
|
index 3611a2e..291677a 100644
|
||||||
|
--- a/src/http/v2/ngx_http_v2.c
|
||||||
|
+++ b/src/http/v2/ngx_http_v2.c
|
||||||
|
@@ -361,6 +361,7 @@ ngx_http_v2_read_handler(ngx_event_t *rev)
|
||||||
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http2 read handler");
|
||||||
|
|
||||||
|
h2c->blocked = 1;
|
||||||
|
+ h2c->new_streams = 0;
|
||||||
|
|
||||||
|
if (c->close) {
|
||||||
|
c->close = 0;
|
||||||
|
@@ -1320,6 +1321,14 @@ ngx_http_v2_state_headers(ngx_http_v2_connection_t *h2c, u_char *pos,
|
||||||
|
goto rst_stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (h2c->new_streams++ >= 2 * h2scf->concurrent_streams) {
|
||||||
|
+ ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
|
||||||
|
+ "client sent too many streams at once");
|
||||||
|
+
|
||||||
|
+ status = NGX_HTTP_V2_REFUSED_STREAM;
|
||||||
|
+ goto rst_stream;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (!h2c->settings_ack
|
||||||
|
&& !(h2c->state.flags & NGX_HTTP_V2_END_STREAM_FLAG)
|
||||||
|
&& h2scf->preread_size < NGX_HTTP_V2_DEFAULT_WINDOW)
|
||||||
|
@@ -1385,6 +1394,12 @@ ngx_http_v2_state_headers(ngx_http_v2_connection_t *h2c, u_char *pos,
|
||||||
|
|
||||||
|
rst_stream:
|
||||||
|
|
||||||
|
+ if (h2c->refused_streams++ > ngx_max(h2scf->concurrent_streams, 100)) {
|
||||||
|
+ ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
|
||||||
|
+ "client sent too many refused streams");
|
||||||
|
+ return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_NO_ERROR);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (ngx_http_v2_send_rst_stream(h2c, h2c->state.sid, status) != NGX_OK) {
|
||||||
|
return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);
|
||||||
|
}
|
||||||
|
diff --git a/src/http/v2/ngx_http_v2.h b/src/http/v2/ngx_http_v2.h
|
||||||
|
index 3492297..6a7aaa6 100644
|
||||||
|
--- a/src/http/v2/ngx_http_v2.h
|
||||||
|
+++ b/src/http/v2/ngx_http_v2.h
|
||||||
|
@@ -125,6 +125,8 @@ struct ngx_http_v2_connection_s {
|
||||||
|
ngx_uint_t processing;
|
||||||
|
ngx_uint_t frames;
|
||||||
|
ngx_uint_t idle;
|
||||||
|
+ ngx_uint_t new_streams;
|
||||||
|
+ ngx_uint_t refused_streams;
|
||||||
|
ngx_uint_t priority_limit;
|
||||||
|
|
||||||
|
ngx_uint_t pushing;
|
@ -0,0 +1,126 @@
|
|||||||
|
From f177201770c75e72ff9c4686b0488a1c4344140c Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Lubo=C5=A1=20Uhliarik?= <luhliari@redhat.com>
|
||||||
|
Date: Mon, 10 Jun 2024 18:22:34 +0200
|
||||||
|
Subject: [PATCH] defer ENGINE_finish() calls to a cleanup
|
||||||
|
|
||||||
|
---
|
||||||
|
src/event/ngx_event_openssl.c | 51 +++++++++++++++++++++++++++--------
|
||||||
|
1 file changed, 40 insertions(+), 11 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c
|
||||||
|
index 2b3c576..b3f06ea 100644
|
||||||
|
--- a/src/event/ngx_event_openssl.c
|
||||||
|
+++ b/src/event/ngx_event_openssl.c
|
||||||
|
@@ -17,7 +17,7 @@ typedef struct {
|
||||||
|
ngx_uint_t engine; /* unsigned engine:1; */
|
||||||
|
} ngx_openssl_conf_t;
|
||||||
|
|
||||||
|
-
|
||||||
|
+static ngx_int_t ngx_ssl_engine_cleanup(void *data);
|
||||||
|
static X509 *ngx_ssl_load_certificate(ngx_pool_t *pool, char **err,
|
||||||
|
ngx_str_t *cert, STACK_OF(X509) **chain);
|
||||||
|
static EVP_PKEY *ngx_ssl_load_certificate_key(ngx_pool_t *pool, char **err,
|
||||||
|
@@ -137,6 +137,15 @@ int ngx_ssl_certificate_name_index;
|
||||||
|
int ngx_ssl_stapling_index;
|
||||||
|
|
||||||
|
|
||||||
|
+static ngx_int_t
|
||||||
|
+ngx_ssl_engine_cleanup(void *data){
|
||||||
|
+ ENGINE *e = data;
|
||||||
|
+
|
||||||
|
+ ENGINE_finish(e);
|
||||||
|
+
|
||||||
|
+ return NGX_OK;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
ngx_int_t
|
||||||
|
ngx_ssl_init(ngx_log_t *log)
|
||||||
|
{
|
||||||
|
@@ -628,8 +637,9 @@ ngx_ssl_load_certificate(ngx_pool_t *pool, char **err, ngx_str_t *cert,
|
||||||
|
|
||||||
|
#ifndef OPENSSL_NO_ENGINE
|
||||||
|
|
||||||
|
- u_char *p, *last;
|
||||||
|
- ENGINE *engine;
|
||||||
|
+ u_char *p, *last;
|
||||||
|
+ ENGINE *engine;
|
||||||
|
+ ngx_pool_cleanup_t *cln;
|
||||||
|
|
||||||
|
p = cert->data + sizeof("engine:") - 1;
|
||||||
|
last = (u_char *) ngx_strchr(p, ':');
|
||||||
|
@@ -654,6 +664,16 @@ ngx_ssl_load_certificate(ngx_pool_t *pool, char **err, ngx_str_t *cert,
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ cln = ngx_pool_cleanup_add(pool, 0);
|
||||||
|
+ if (cln == NULL) {
|
||||||
|
+ *err = "failed to add ENGINE cleanup";
|
||||||
|
+ ENGINE_free(engine);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ cln->handler = ngx_ssl_engine_cleanup;
|
||||||
|
+ cln->data = engine;
|
||||||
|
+
|
||||||
|
*last++ = ':';
|
||||||
|
|
||||||
|
struct {
|
||||||
|
@@ -667,7 +687,6 @@ ngx_ssl_load_certificate(ngx_pool_t *pool, char **err, ngx_str_t *cert,
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
- ENGINE_finish(engine);
|
||||||
|
ENGINE_free(engine);
|
||||||
|
|
||||||
|
/* set chain to null */
|
||||||
|
@@ -775,11 +794,13 @@ static EVP_PKEY *
|
||||||
|
ngx_ssl_load_certificate_key(ngx_pool_t *pool, char **err,
|
||||||
|
ngx_str_t *key, ngx_array_t *passwords)
|
||||||
|
{
|
||||||
|
- BIO *bio;
|
||||||
|
- EVP_PKEY *pkey;
|
||||||
|
- ngx_str_t *pwd;
|
||||||
|
- ngx_uint_t tries;
|
||||||
|
- pem_password_cb *cb;
|
||||||
|
+ BIO *bio;
|
||||||
|
+ EVP_PKEY *pkey;
|
||||||
|
+ ngx_str_t *pwd;
|
||||||
|
+ ngx_uint_t tries;
|
||||||
|
+ pem_password_cb *cb;
|
||||||
|
+ ngx_pool_cleanup_t *cln;
|
||||||
|
+
|
||||||
|
|
||||||
|
if (ngx_strncmp(key->data, "engine:", sizeof("engine:") - 1) == 0) {
|
||||||
|
|
||||||
|
@@ -811,18 +832,26 @@ ngx_ssl_load_certificate_key(ngx_pool_t *pool, char **err,
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ cln = ngx_pool_cleanup_add(pool, 0);
|
||||||
|
+ if (cln == NULL) {
|
||||||
|
+ *err = "failed to add ENGINE cleanup";
|
||||||
|
+ ENGINE_free(engine);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ cln->handler = ngx_ssl_engine_cleanup;
|
||||||
|
+ cln->data = engine;
|
||||||
|
+
|
||||||
|
*last++ = ':';
|
||||||
|
|
||||||
|
pkey = ENGINE_load_private_key(engine, (char *) last, 0, 0);
|
||||||
|
|
||||||
|
if (pkey == NULL) {
|
||||||
|
*err = "ENGINE_load_private_key() failed";
|
||||||
|
- ENGINE_finish(engine);
|
||||||
|
ENGINE_free(engine);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
- ENGINE_finish(engine);
|
||||||
|
ENGINE_free(engine);
|
||||||
|
|
||||||
|
return pkey;
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
@ -0,0 +1,183 @@
|
|||||||
|
From f3bcc0bcfb6eda3f4874fe2531d546ba724c518c Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Lubo=C5=A1=20Uhliarik?= <luhliari@redhat.com>
|
||||||
|
Date: Wed, 12 Jun 2024 12:49:28 +0200
|
||||||
|
Subject: [PATCH] Optimized chain link usage
|
||||||
|
|
||||||
|
Previously chain links could sometimes be dropped instead of being reused,
|
||||||
|
which could result in increased memory consumption during long requests.
|
||||||
|
---
|
||||||
|
src/core/ngx_output_chain.c | 10 ++++++++--
|
||||||
|
src/http/modules/ngx_http_grpc_module.c | 5 ++++-
|
||||||
|
.../modules/ngx_http_gunzip_filter_module.c | 18 ++++++++++++++----
|
||||||
|
src/http/modules/ngx_http_gzip_filter_module.c | 10 +++++++---
|
||||||
|
src/http/modules/ngx_http_ssi_filter_module.c | 8 ++++++--
|
||||||
|
src/http/modules/ngx_http_sub_filter_module.c | 8 ++++++--
|
||||||
|
6 files changed, 45 insertions(+), 14 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/core/ngx_output_chain.c b/src/core/ngx_output_chain.c
|
||||||
|
index 5c3dbe8..4aa1b02 100644
|
||||||
|
--- a/src/core/ngx_output_chain.c
|
||||||
|
+++ b/src/core/ngx_output_chain.c
|
||||||
|
@@ -121,7 +121,10 @@ ngx_output_chain(ngx_output_chain_ctx_t *ctx, ngx_chain_t *in)
|
||||||
|
|
||||||
|
ngx_debug_point();
|
||||||
|
|
||||||
|
- ctx->in = ctx->in->next;
|
||||||
|
+ cl = ctx->in;
|
||||||
|
+ ctx->in = cl->next;
|
||||||
|
+
|
||||||
|
+ ngx_free_chain(ctx->pool, cl);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
@@ -207,7 +210,10 @@ ngx_output_chain(ngx_output_chain_ctx_t *ctx, ngx_chain_t *in)
|
||||||
|
/* delete the completed buf from the ctx->in chain */
|
||||||
|
|
||||||
|
if (ngx_buf_size(ctx->in->buf) == 0) {
|
||||||
|
- ctx->in = ctx->in->next;
|
||||||
|
+ cl = ctx->in;
|
||||||
|
+ ctx->in = cl->next;
|
||||||
|
+
|
||||||
|
+ ngx_free_chain(ctx->pool, cl);
|
||||||
|
}
|
||||||
|
|
||||||
|
cl = ngx_alloc_chain_link(ctx->pool);
|
||||||
|
diff --git a/src/http/modules/ngx_http_grpc_module.c b/src/http/modules/ngx_http_grpc_module.c
|
||||||
|
index 53bc547..9f13089 100644
|
||||||
|
--- a/src/http/modules/ngx_http_grpc_module.c
|
||||||
|
+++ b/src/http/modules/ngx_http_grpc_module.c
|
||||||
|
@@ -1230,7 +1230,7 @@ ngx_http_grpc_body_output_filter(void *data, ngx_chain_t *in)
|
||||||
|
ngx_buf_t *b;
|
||||||
|
ngx_int_t rc;
|
||||||
|
ngx_uint_t next, last;
|
||||||
|
- ngx_chain_t *cl, *out, **ll;
|
||||||
|
+ ngx_chain_t *cl, *out, *ln, **ll;
|
||||||
|
ngx_http_upstream_t *u;
|
||||||
|
ngx_http_grpc_ctx_t *ctx;
|
||||||
|
ngx_http_grpc_frame_t *f;
|
||||||
|
@@ -1458,7 +1458,10 @@ ngx_http_grpc_body_output_filter(void *data, ngx_chain_t *in)
|
||||||
|
last = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ ln = in;
|
||||||
|
in = in->next;
|
||||||
|
+
|
||||||
|
+ ngx_free_chain(r->pool, ln);
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx->in = in;
|
||||||
|
diff --git a/src/http/modules/ngx_http_gunzip_filter_module.c b/src/http/modules/ngx_http_gunzip_filter_module.c
|
||||||
|
index c1341f5..5d170a1 100644
|
||||||
|
--- a/src/http/modules/ngx_http_gunzip_filter_module.c
|
||||||
|
+++ b/src/http/modules/ngx_http_gunzip_filter_module.c
|
||||||
|
@@ -333,6 +333,8 @@ static ngx_int_t
|
||||||
|
ngx_http_gunzip_filter_add_data(ngx_http_request_t *r,
|
||||||
|
ngx_http_gunzip_ctx_t *ctx)
|
||||||
|
{
|
||||||
|
+ ngx_chain_t *cl;
|
||||||
|
+
|
||||||
|
if (ctx->zstream.avail_in || ctx->flush != Z_NO_FLUSH || ctx->redo) {
|
||||||
|
return NGX_OK;
|
||||||
|
}
|
||||||
|
@@ -344,8 +346,11 @@ ngx_http_gunzip_filter_add_data(ngx_http_request_t *r,
|
||||||
|
return NGX_DECLINED;
|
||||||
|
}
|
||||||
|
|
||||||
|
- ctx->in_buf = ctx->in->buf;
|
||||||
|
- ctx->in = ctx->in->next;
|
||||||
|
+ cl = ctx->in;
|
||||||
|
+ ctx->in_buf = cl->buf;
|
||||||
|
+ ctx->in = cl->next;
|
||||||
|
+
|
||||||
|
+ ngx_free_chain(r->pool, cl);
|
||||||
|
|
||||||
|
ctx->zstream.next_in = ctx->in_buf->pos;
|
||||||
|
ctx->zstream.avail_in = ctx->in_buf->last - ctx->in_buf->pos;
|
||||||
|
@@ -374,6 +379,7 @@ static ngx_int_t
|
||||||
|
ngx_http_gunzip_filter_get_buf(ngx_http_request_t *r,
|
||||||
|
ngx_http_gunzip_ctx_t *ctx)
|
||||||
|
{
|
||||||
|
+ ngx_chain_t *cl;
|
||||||
|
ngx_http_gunzip_conf_t *conf;
|
||||||
|
|
||||||
|
if (ctx->zstream.avail_out) {
|
||||||
|
@@ -383,8 +389,12 @@ ngx_http_gunzip_filter_get_buf(ngx_http_request_t *r,
|
||||||
|
conf = ngx_http_get_module_loc_conf(r, ngx_http_gunzip_filter_module);
|
||||||
|
|
||||||
|
if (ctx->free) {
|
||||||
|
- ctx->out_buf = ctx->free->buf;
|
||||||
|
- ctx->free = ctx->free->next;
|
||||||
|
+
|
||||||
|
+ cl = ctx->free;
|
||||||
|
+ ctx->out_buf = cl->buf;
|
||||||
|
+ ctx->free = cl->next;
|
||||||
|
+
|
||||||
|
+ ngx_free_chain(r->pool, cl);
|
||||||
|
|
||||||
|
ctx->out_buf->flush = 0;
|
||||||
|
|
||||||
|
diff --git a/src/http/modules/ngx_http_gzip_filter_module.c b/src/http/modules/ngx_http_gzip_filter_module.c
|
||||||
|
index b8c5ccc..1d17a6d 100644
|
||||||
|
--- a/src/http/modules/ngx_http_gzip_filter_module.c
|
||||||
|
+++ b/src/http/modules/ngx_http_gzip_filter_module.c
|
||||||
|
@@ -978,10 +978,14 @@ static void
|
||||||
|
ngx_http_gzip_filter_free_copy_buf(ngx_http_request_t *r,
|
||||||
|
ngx_http_gzip_ctx_t *ctx)
|
||||||
|
{
|
||||||
|
- ngx_chain_t *cl;
|
||||||
|
+ ngx_chain_t *cl, *ln;
|
||||||
|
+
|
||||||
|
+ for (cl = ctx->copied; cl; /* void */) {
|
||||||
|
+ ln = cl;
|
||||||
|
+ cl = cl->next;
|
||||||
|
|
||||||
|
- for (cl = ctx->copied; cl; cl = cl->next) {
|
||||||
|
- ngx_pfree(r->pool, cl->buf->start);
|
||||||
|
+ ngx_pfree(r->pool, ln->buf->start);
|
||||||
|
+ ngx_free_chain(r->pool, ln);
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx->copied = NULL;
|
||||||
|
diff --git a/src/http/modules/ngx_http_ssi_filter_module.c b/src/http/modules/ngx_http_ssi_filter_module.c
|
||||||
|
index 6737965..a55f6e5 100644
|
||||||
|
--- a/src/http/modules/ngx_http_ssi_filter_module.c
|
||||||
|
+++ b/src/http/modules/ngx_http_ssi_filter_module.c
|
||||||
|
@@ -455,9 +455,13 @@ ngx_http_ssi_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
|
||||||
|
while (ctx->in || ctx->buf) {
|
||||||
|
|
||||||
|
if (ctx->buf == NULL) {
|
||||||
|
- ctx->buf = ctx->in->buf;
|
||||||
|
- ctx->in = ctx->in->next;
|
||||||
|
+
|
||||||
|
+ cl = ctx->in;
|
||||||
|
+ ctx->buf = cl->buf;
|
||||||
|
+ ctx->in = cl->next;
|
||||||
|
ctx->pos = ctx->buf->pos;
|
||||||
|
+
|
||||||
|
+ ngx_free_chain(r->pool, cl);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ctx->state == ssi_start_state) {
|
||||||
|
diff --git a/src/http/modules/ngx_http_sub_filter_module.c b/src/http/modules/ngx_http_sub_filter_module.c
|
||||||
|
index 6d3de59..456bb27 100644
|
||||||
|
--- a/src/http/modules/ngx_http_sub_filter_module.c
|
||||||
|
+++ b/src/http/modules/ngx_http_sub_filter_module.c
|
||||||
|
@@ -335,9 +335,13 @@ ngx_http_sub_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
|
||||||
|
while (ctx->in || ctx->buf) {
|
||||||
|
|
||||||
|
if (ctx->buf == NULL) {
|
||||||
|
- ctx->buf = ctx->in->buf;
|
||||||
|
- ctx->in = ctx->in->next;
|
||||||
|
+
|
||||||
|
+ cl = ctx->in;
|
||||||
|
+ ctx->buf = cl->buf;
|
||||||
|
+ ctx->in = cl->next;
|
||||||
|
ctx->pos = ctx->buf->pos;
|
||||||
|
+
|
||||||
|
+ ngx_free_chain(r->pool, cl);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ctx->buf->flush || ctx->buf->recycled) {
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
@ -0,0 +1,69 @@
|
|||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
|
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
|
||||||
|
yh4LsaVRdhbFe9aNd/O5iNgDcQtCUg==
|
||||||
|
=/pFc
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
@ -0,0 +1,33 @@
|
|||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
Version: GnuPG v1.4.11 (FreeBSD)
|
||||||
|
|
||||||
|
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
|
||||||
|
=Tavt
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
Before Width: | Height: | Size: 368 B |
@ -0,0 +1,41 @@
|
|||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
Version: GnuPG v1.4.11 (FreeBSD)
|
||||||
|
|
||||||
|
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
|
||||||
|
CoHAyoqJeb/xLBwuKWg0/4U=
|
||||||
|
=iFlP
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
Loading…
Reference in new issue