11package httpsignatures_test
22
33import (
4+ "crypto/rsa"
5+ "crypto/x509"
6+ "encoding/pem"
47 "net/http"
58
69 "github.com/99designs/httpsignatures-go"
710)
811
12+ const (
13+ ExamplePrivateKey = `-----BEGIN RSA PRIVATE KEY-----
14+ MIICXgIBAAKBgQDCFENGw33yGihy92pDjZQhl0C36rPJj+CvfSC8+q28hxA161QF
15+ NUd13wuCTUcq0Qd2qsBe/2hFyc2DCJJg0h1L78+6Z4UMR7EOcpfdUE9Hf3m/hs+F
16+ UR45uBJeDK1HSFHD8bHKD6kv8FPGfJTotc+2xjJwoYi+1hqp1fIekaxsyQIDAQAB
17+ AoGBAJR8ZkCUvx5kzv+utdl7T5MnordT1TvoXXJGXK7ZZ+UuvMNUCdN2QPc4sBiA
18+ QWvLw1cSKt5DsKZ8UETpYPy8pPYnnDEz2dDYiaew9+xEpubyeW2oH4Zx71wqBtOK
19+ kqwrXa/pzdpiucRRjk6vE6YY7EBBs/g7uanVpGibOVAEsqH1AkEA7DkjVH28WDUg
20+ f1nqvfn2Kj6CT7nIcE3jGJsZZ7zlZmBmHFDONMLUrXR/Zm3pR5m0tCmBqa5RK95u
21+ 412jt1dPIwJBANJT3v8pnkth48bQo/fKel6uEYyboRtA5/uHuHkZ6FQF7OUkGogc
22+ mSJluOdc5t6hI1VsLn0QZEjQZMEOWr+wKSMCQQCC4kXJEsHAve77oP6HtG/IiEn7
23+ kpyUXRNvFsDE0czpJJBvL/aRFUJxuRK91jhjC68sA7NsKMGg5OXb5I5Jj36xAkEA
24+ gIT7aFOYBFwGgQAQkWNKLvySgKbAZRTeLBacpHMuQdl1DfdntvAyqpAZ0lY0RKmW
25+ G6aFKaqQfOXKCyWoUiVknQJAXrlgySFci/2ueKlIE1QqIiLSZ8V8OlpFLRnb1pzI
26+ 7U1yQXnTAEFYM560yJlzUpOb1V4cScGd365tiSMvxLOvTA==
27+ -----END RSA PRIVATE KEY-----`
28+ ExamplePublicyKey = `-----BEGIN PUBLIC KEY-----
29+ MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCFENGw33yGihy92pDjZQhl0C3
30+ 6rPJj+CvfSC8+q28hxA161QFNUd13wuCTUcq0Qd2qsBe/2hFyc2DCJJg0h1L78+6
31+ Z4UMR7EOcpfdUE9Hf3m/hs+FUR45uBJeDK1HSFHD8bHKD6kv8FPGfJTotc+2xjJw
32+ oYi+1hqp1fIekaxsyQIDAQAB
33+ -----END PUBLIC KEY-----`
34+ )
35+
936func Example_signing () {
1037 r , _ := http .NewRequest ("GET" , "http://example.com/some-api" , nil )
1138
@@ -17,6 +44,20 @@ func Example_signing() {
1744 http .DefaultClient .Do (r )
1845}
1946
47+ func Example_signingRSA () {
48+ block , _ := pem .Decode ([]byte (ExamplePrivateKey ))
49+ privateKey , _ := x509 .ParsePKCS1PrivateKey (block .Bytes )
50+
51+ r , _ := http .NewRequest ("GET" , "http://example.com/some-api" , nil )
52+
53+ // Sign using the 'Signature' header
54+ httpsignatures .DefaultRsaSha256Signer .SignRequestRSA ("KeyId" , privateKey , r )
55+ // OR Sign using the 'Authorization' header
56+ httpsignatures .DefaultRsaSha256Signer .AuthRequestRSA ("KeyId" , privateKey , r )
57+
58+ http .DefaultClient .Do (r )
59+ }
60+
2061func Example_customSigning () {
2162 signer := httpsignatures .NewSigner (
2263 httpsignatures .AlgorithmHmacSha256 ,
@@ -51,3 +92,28 @@ func Example_verification() {
5192 // request was signed correctly.
5293 }
5394}
95+
96+ func Example_verificationRSA () {
97+ _ = func (w http.ResponseWriter , r * http.Request ) {
98+ sig , err := httpsignatures .FromRequest (r )
99+ if err != nil {
100+ // Probably a malformed header
101+ http .Error (w , "Bad Request" , http .StatusBadRequest )
102+ panic (err )
103+ }
104+
105+ // if you have headers that must be signed check
106+ // that they are in sig.Headers
107+
108+ var pemPublicKeyBytes []byte // = lookup using sig.KeyID
109+ block , _ := pem .Decode (pemPublicKeyBytes )
110+ publicKey , _ := x509 .ParsePKIXPublicKey (block .Bytes )
111+
112+ if ! sig .IsValidRSA (publicKey .(* rsa.PublicKey ), r ) {
113+ http .Error (w , "Forbidden" , http .StatusForbidden )
114+ return
115+ }
116+
117+ // request was signed correctly.
118+ }
119+ }
0 commit comments